一、多文件程序集
程序集由模块构成,多文件程序集是指包含多个模块的程序集。多文件程序集只能有一个入口点,即使程序集有多个代码模块。
创建多文件程序集的原因有以下几个:
1、合并由几个开发人员编写的代码模块。虽然每一位开发人员都可以将各个代码模块编译成程序集,但这样会强制一些类型公开(如果所有模块均放在多文件程序集中,则不会公开)。
2、合并用不同语言编写的模块。这是创建多文件程序集最常见的原因。
3、将不常用的类型放在只在需要时才下载的模块中,以优化应用程序的下载。如果所创建的应用程序将使用 <object> 标记和 Microsoft Internet Explorer 来进行下载,那么创建多文件程序集就很重要。在此方案中,创建与只包含程序集清单的代码模块分开的文件。Internet Explorer 首先下载程序集清单,然后创建辅助线程以下载所需的任何其他模块或程序集。由于正在下载包含程序集清单的文件,Internet Explorer 将不响应用户的输入。 包含程序集清单的文件越小,Internet Explorer 不作响应的时间就越短。
创建程序集后,可为包含程序集清单(并因此包含程序集)的文件签名,或者为文件(及程序集)指定强名称并将其放在全局程序集缓存中。
二、如何生成多文件程序集
1、将包含程序集中其他模块引用的命名空间的所有文件编译成代码模块。
2、编译所有其他模块,使用必要的编译器选项来表明代码中引用的其他模块。
3、使用程序集连接器(Al.exe)来创建包含程序集清单的输出文件。 此文件包含作为程序集组成部分的所有模块或资源的参考信息。
说明:C# 和 Visual Basic Visual Studio IDE 仅用于创建单文件程序集。 如果要创建多文件程序集,则必须使用命令行编译器或带有 Visual C++ 的 Visual Studio 2005。
例如:有三个代码文件test1.cs、test2.cs、test3.cs,分别属于不同的命名空间(当然也可以属于同一个命名空间),源码如下:
test1.cs
using System; namespace NsA
{ public class Test1 { public static void Print() { Console.WriteLine("Module 1"); } } }
test2.cs
using System; namespace NsB
{ public class Test2 { public static void Print() { Console.WriteLine("Module 2"); } } }
test3.cs
using System; namespace NsC
{ public class Test3 { public static void Print() { Console.WriteLine("Module 3"); } } }
要将这三个cs文件生成到同一个程序集中,具体步骤如下:
(1)打开Visual Studio的命令行工具。
(2)将工作目录切换到cs文件所在的目录。
(3)输入命令:csc.exe /t:module test1.cs,生成test1.netmodule模块文件。
(4)输入命令:csc.exe /t:module test2.cs,生成test2.netmodule模块文件。
(5)输入命令:csc.exe /t:module test3.cs,生成test3.netmodule模块文件。
(6)输入命令:al test1.netmodule test2.netmodule test3.netmodule /out:TestModule.dll /t:library,使用程序集连接器将多个模块生成到程序集TestModule.dll中。
若是只有test1、test2两个模块,在步骤(1)(2)(3)后,可直接输入csc.exe /t:library /out:TestModule.dll test2.cs /addmodule:test1.netmodule,生成双文件程序集。
可以使用 MSIL 反汇编程序(Ildasm.exe)来检查程序集的内容。