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

开发者社区> 开发与运维> 正文

《圣殿祭司的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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章