在App_Code中使用多种语言

App_Code和Bin文件夹的不同之处在于Bin文件夹里面存储的是已经编译好的程序集,而App_Code存储的是源代码,默认情况下他们在动行时会被编译成单个程序集。这就会发生一个现象:由于Bin中是已经编译好的程序集,所以他们可以是由各种不同的语言编写的,而App_Code中的源代码在是运行时动态编译成单个程序集,所以你不能在App_Code中存放各种语言编写的源代码,如ClassA.vb、ClassB.cs,否则将无法编译,你会收到类似的错误信息:

引用内容 引用内容
System.Web.HttpException: 文件“/App_Code/ClassA.vb”和“/App_Code/ClassB.cs”使用的语言不同,这是不允许的,因为它们要在一起编译。

我们并未显示的标记App_Code中的源代码是使用哪种语言编写的,那编译的时候是怎么判断的?估计是根据文件的类型(假设的),如果是.vb文件则调用Visual Basic编译器,如果是.cs文件则调用C#编译器,所以你不能在App_Code中存放多种类型的文件,否则将无法判断应用哪种类型编译器来生成单个程序集!

不过在文章的开头我们有说"默认情况下他们在动行时会被编译成单个程序集",实际上通过配置我们可以实现将App_Code某个子文件夹的源代码单独编译成一个程序集,只要保证该子文件夹中的源代码使用一种语言编写即可,这样就可以将App_Code中的源代码编译成多个程序集,那上边的问题就解决了。配置方法也很简单,在Web.Config中增加codeSubDirectories节点即可,如:

<system.web>
    <compilation>
        <codeSubDirectories>
            <add directoryName="VBCode" />
            <add directoryName="CSCode" />
        </codeSubDirectories>
    </compilation>
</system.web>

这样VBCode和CSCode子文件中的源代码都将被编译成单个程序集。注意上边文件夹不表示VBCode子文件夹下源代码必须是用vb编写,CSCode子文件夹下的源代码必须是用C#编写,还是在运行的时候根据子文件夹中的文件类型来决定使用哪种编译器的。

评论: 0 | 引用: 0 | 查看次数: 4159
发表评论
登录后再发表评论!