1.经过C#编译器生成的文件托管模块,该托管模块是标准的可移植执行体文件(PE32(+)),该文件包含四个部分:
元数据是由几个表构成的二进制数据块,包含三种表:定义表、引用表和清单表(manifest table)。可用ILdasm工具查看模块的元数据表。ex:ILDasm Program.exe。
2.将模块合并成程序集
程序集:程序集是一个或多个类型定义文件以及资源文件的集合。在程序集的所有文件中,有一个文件容纳了清单(manifest)。清单也是一个元数据表集合,表中主要包含作为程序集组成部分的那些文件的名称。此外,还描述了程序集的版本、语言文化、发布者、公开导出的类型以及构成程序集的所有文件。
生成程序集要么选择现有的PE文件作为“清单”的宿主,要么创建单独的PE文件并只在其中包含清单。
指定以下任何开关,C#编译器都会生成程序集:
所有这些开关都会造成编译器生成含有清单元数据表的PE文件。
除此之外,C#编译器还支持/t[arget]:module开关,它指示编译器生成一个不含清单元数据表的 标准的DLL PE文件,默认输出文件扩展名为.netmodule。CLR想要访问其中的任何类型,都要先将该文件添加到一个程序集中。
VS IDE不能创建多文件程序集,只能使用命令行工具创建多文件程序集。
将模块添加到程序集:/addmodule开关 ex:
csc /t:module RUT.cs (生成RUT.netmodule文件)
csc /out:MultiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs (此命令行命令告诉C#编译器编译FUT.cs生成MultiFileLibrary.dll文件。由于指定了/t:library开关,所以生成的是含清单元数据表集的DLL PE文件。/addmodule开关告诉编译器将RUT.netmodule是程序集的一部分。具体地说,/addmodule开关告诉编译器将文件添加到FileDef清单元数据表,并将RUT.netmodule的公开导出类型添加到ExportedTypesDef清单元数据表。
3.使用程序集链接器
AL.exe使用场合:
为程序集添加资源文件:
4.程序集版本资源信息
在应用程序代码中调用System.Diagnostics.FileVersionInfo的静态方法GetVersionInfo,并传递程序集的路径作为参数,就可以获取并检查这些信息。
AssemblyInfo.cs可生成程序集的版本信息。
项目属性的程序集信息也可以查看并修改这些信息。
5.语言文化
创建含代码的程序集时一般不指定具体的语言文化。未指定具体语言文化的程序集成为语言文化中性。如果应用程序包含语言文化特有的资源,Microsoft强烈建议专门创建一个程序集来包含代码和应用程序的默认(备用)资源。生成该程序集时不要指定具体的语言文化,其他程序集通过引用该程序集来操纵和创建它公开的类型。
然后,创建一个或多个单独的程序集,只在其中包含语言文化特有的资源--不要包含任何代码。标记了语言文化特性的程序集称为附属程序集(satellite assembly)。为附属程序集指定的语言文化应准确反映程序集中的资源的语言文化。针对想要支持的每种语言文化都要创建单独的附属程序集。
使用AL.exe的/c[ulture]:text开关指定语言文化,其中text是语言文化字符串,例如"en-US"代表美国英语。部署附属程序集时,应该把它保存到专门的子目录中,子目录名称和语言文化的文本匹配。ex:假定应用程序的基目录是C:\MyApp,于美国英语对应的附属程序集就应该放到C:\MyApp\en-US子目录。在运行时,使用System.Resources.ResourceManager来访问附属程序集的资源。
可以使用定制特性System.Reflection.AssemblyCultureAttribute代替AL.EXE的/culture开关指定语言文化,ex:
将程序集的语言文化设置为瑞士德语:
[assembly:AssemblyCulture("de-CH")].
原文:https://www.cnblogs.com/long612-/p/12060613.html