《圣殿祭司的ASP.NET4.0专家技术手册》---- 1-14 项目同时使用C# 与VB语言及多组件的技巧

简介: 早期VS.NET 2002及VS.NET 2003的Visual Studio工具不支持多个组件文件(Assembly),也就是项目编译后只会产生一个dll组件,而一个组件只允许包含一种语言(因为系统会调用对应C#或VB编译程序进行编译),因此在同一个项目中要使用两种语言是办不到的;但在VS 2010中,因为项目支持多个组件,所以利用这个特性就可以同时使用两种以上的语言(如C#与VB),因此.cs或.vb的类别在项目中就可以直接拿来使用,直接就可以new instance,不需要先编译成dll文件再加以引用。

本节书摘来自异步社区《圣殿祭司的ASP.NET4.0专家技术手册》一书中的第1章,第14节,作者: 奚江华,译者: 武海军 , 更多章节内容可以访问云栖社区“异步社区”公众号查看。

1-14 项目同时使用C# 与VB语言及多组件的技巧

圣殿祭司的ASP.NET4.0专家技术手册
早期VS.NET 2002及VS.NET 2003的Visual Studio工具不支持多个组件文件(Assembly),也就是项目编译后只会产生一个dll组件,而一个组件只允许包含一种语言(因为系统会调用对应C#或VB编译程序进行编译),因此在同一个项目中要使用两种语言是办不到的;但在VS 2010中,因为项目支持多个组件,所以利用这个特性就可以同时使用两种以上的语言(如C#与VB),因此.cs或.vb的类别在项目中就可以直接拿来使用,直接就可以new instance,不需要先编译成dll文件再加以引用。这样一来对于许多公司或程序员来说,灵活性变大了。

至于项目支持多个组件是如何办到的?在前面提到ASP.NET中有许多内建特殊文件夹,如App_Code、App_GlobalResources等,只要归类在这些文件夹的文件,在编译时就会产生独立的组件,各位可以建立一个项目进行测试,加入类文件、资源文件、Web Services等,最后再用aspnet_compiler.exe预编译后,再检查编译后目标路径的bin目录,里面同时包含好几个dll文件,就是证据。

范例1-9 ASP.NET 4.0项目同时使用C#与VB类程序
利用多个组件的原理,在ASP.NET 4.0项目中可同时使用C#与VB类程序,如图1-46所示。但必须遵守一些程序及技巧,请参考MultiLang. aspx程序。具体步骤如下。


954aedd47eb4d13eae9b2cbd570a08a214e19b20

如果C#项目中使用到VB的相关功能,请自行加入相关命名空间的参照,以及在VB程序中Import命名空间。

在Web.config文件中设置C# 与VB目录分隔:

<configuration>
    <system.web>
        <compilation>
            <codeSubDirectories>
                <add directoryName="cs"/>
                <add directoryName="vb"/>
            </codeSubDirectories>
        </compilation>
    </system.web>
</configuration>

上面的directoryName是对应下一个步骤cs及vb所要加入的目录名称。

在网站上按鼠标右键,在弹出的菜单中选择【属性页】→【加入ASP.NET文件夹】→加入“App_Code”文件夹,在App_Code文件夹中加入“cs”及“vb”两个文件夹,以作为C#与VB类各自存放的目录,如图1-47所示。


c27d0bb4272a91f70d86aededfc1b29ddb463ab9

在cs文件夹中加入CSharpObject.cs类程序:

using System;
public class CSharpObject
{
    public string Hello()
    {
        return "Hi...C#";
    }
}

在vb文件夹中加入VBObject.vb类程序:

Imports Microsoft.VisualBasic
Public Class VBObject
    Public Function Hello() As String
        Return "Hi...VB"
    End Function
End Class

分别双击“调用C#类”及“调用VB类”按钮加入Click事件程序:

01   /调用C#类
02   protected void btnCSharp_Click(object sender, EventArgs e)
03   {
04   CSharpObject myCSharpObject = new CSharpObject();
05   txtMsg1.Text = myCSharpObject.Hello();
06
07    
08    //调用VB类
09    protected void btnVB_Click(object sender, EventArgs e)
10    {
11        VBObject myVBObject = new VBObject();
12        txtMsg2.Text = myVBObject.Hello();
13    }

附注 (1)在VS.NET 2003中,若项目必须使用多个组件,虽说Visual Studio本身不支持,
但可使用Assembly Linker(AL.exe)手工来完成,并非.NET不能做。

(2)同时使用C# 与VB类别程序,并非是指在同一个类别中可以穿插混合使用两种语
言,如1、3、5行使用C#,2、4、6行使用VB,倘若这样,只会造成大乱。

(3)在这只是告知VS 2010中要如何使用两种语言,至于一个项目是否应该同时使用
C#或VB两种语言,它有实际面、策略面的议题,故要不要用,必须由贵公司或项
目本身需求去评量决策,祭司不发表意见。
此外要提出一个思考点,上面理论的确很精采,也确实能够正常执行运作,但是如何证明真的会产生多个组件?若不能证明的话,信或不信比例可能各占一半。然而要证明它有点困难,因为VS 2010构建编译网站后,不会像VS.NET 2003在项目所在路径下的Bin目录中产生一个dll组件,所以,根本没法查看是否有多个组件,那怎办?还记得前面介绍过aspnet_compiler.exe预编译这个工具吗?在此利用这个工具编译“VS2010IDE”项目,指令如下:

Aspnet_compiler –v VS2010IDE C:\TMP\VS2010IDE –f
编译后的项目会输出到C:TMPVS2010IDE,接着到该路径下的Bin目录,可以发现确实按照目录而产生AppSubcode_cs.dll与App Subcode_vb.dll两个组件,如图1-48所示,这样就能得到验证!

即便项目没有同时使用VB与C# 两种语言的需求,是否这个技巧就没有其他附加价值呢?还是可以利用相同的原理做出多个组件,而不必每次都调用一个很庞大的dll组件,这样不但系统略为笨重,且又会非常耗用资源,如果项目程序十分庞大,可利用这个技巧产生多个组件,有意义地分解成多个较小组件,求得更佳的系统性能。


734f1bec5497e9bab16ab2ed1ea24cf539564ee7

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
11天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
62 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
1月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
58 1
|
1月前
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
102 3
|
11天前
|
搜索推荐 API C#
.NET开源快速、强大、免费的电子表格组件
.NET开源快速、强大、免费的电子表格组件
|
4天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
SQL 存储 关系型数据库
C# .NET面试系列十:数据库概念知识
#### 1. 为什么要一定要设置主键? 设置主键是数据库设计中的一个重要概念,有几个主要原因: 1、唯一性 ```c# 主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。如果没有主键或者主键不唯一,就可能出现数据混乱或错误。 ``` 2、查询性能 ```c# 数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。 ``` 3、关联性 ```c# 主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。 ``` 4、数据完
131 1
C# .NET面试系列十:数据库概念知识
|
1月前
|
XML 开发框架 .NET
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService
## 第二部分:ADO.NET、XML、HTTP、AJAX、WebService #### 1. .NET 和 C# 有什么区别? .NET(通用语言运行时): ```c# 定义:.NET 是一个软件开发框架,提供了一个通用的运行时环境,用于在不同的编程语言中执行代码。 作用:它为多语言支持提供了一个统一的平台,允许不同的语言共享类库和其他资源。.NET 包括 Common Language Runtime (CLR)、基础类库(BCL)和其他工具。 ``` C#(C Sharp): ```c# 定义: C# 是一种由微软设计的面向对象的编程语言,专门为.NET 平台开发而创建。 作
174 2
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
60 0

相关实验场景

更多