本节书摘来自异步社区《圣殿祭司的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程序。具体步骤如下。
如果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所示。
在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组件,这样不但系统略为笨重,且又会非常耗用资源,如果项目程序十分庞大,可利用这个技巧产生多个组件,有意义地分解成多个较小组件,求得更佳的系统性能。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。