生成、打包、部署和管理应用程序及类型

1.经过C#编译器生成的文件托管模块,该托管模块是标准的可移植执行体文件(PE32(+)),该文件包含四个部分:

  • PE头:决定模块的CPU架构等
  • CLR头:包含模块生成时的CLR版本号,一些标志,一个MethodDef token(指定了模块的入口方法),一个可选的强名称数字签名和模块内部的元数据表的大小及偏移量。
  • 元数据
  • IL

元数据是由几个表构成的二进制数据块,包含三种表:定义表、引用表和清单表(manifest table)。可用ILdasm工具查看模块的元数据表。ex:ILDasm Program.exe。

2.将模块合并成程序集

程序集:程序集是一个或多个类型定义文件以及资源文件的集合。在程序集的所有文件中,有一个文件容纳了清单(manifest)。清单也是一个元数据表集合,表中主要包含作为程序集组成部分的那些文件的名称。此外,还描述了程序集的版本、语言文化、发布者、公开导出的类型以及构成程序集的所有文件。

生成程序集要么选择现有的PE文件作为“清单”的宿主,要么创建单独的PE文件并只在其中包含清单。

  • 清单元数据表包含:AssembleDef,FileDef,ManifestResourceDef,ExportedTypesDef,AssemblyRef(程序集全部文件引用的每个程序集在这个表中都有一个记录项)

指定以下任何开关,C#编译器都会生成程序集:

  • /t[arget]:exe
  • /t[arget]:winexe
  • /t:[arget]:library
  • /t[arget]:appcontainerexe
  • /t[arget]:winmdobj

所有这些开关都会造成编译器生成含有清单元数据表的PE文件。

除此之外,C#编译器还支持/t[arget]:module开关,它指示编译器生成一个不含清单元数据表的 标准的DLL PE文件,默认输出文件扩展名为.netmodule。CLR想要访问其中的任何类型,都要先将该文件添加到一个程序集中。

VS IDE不能创建多文件程序集,只能使用命令行工具创建多文件程序集。

将模块添加到程序集:/addmodule开关 ex:

扫描二维码关注公众号,回复: 8231488 查看本文章

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使用场合:

  • 程序集要包含由不同编译器生成的模块
  • 生成时不清楚程序集的打包要求
  • 生成只含资源文件的程序集,即附属程序集(satellite assembly)。

为程序集添加资源文件:

  • 用AL.exe创建程序集时,可使用/embed[resource]开关将文件作为资源添加到程序集。该开关获取任意文件,并将文件内容嵌入最终的PE文件。清单的ManifestResourceDef会更新以反映新资源的存在。
  • AL.exe还支持/link[resource]开关,它同样获取包含资源的文件,但只是更新清单的ManifestResourceDef和FileDef表以反映新资源的存在,指出资源包含在程序集的哪个文件中。资源文件不会嵌入程序集PE文件中;相反,它保持独立,而且必须和其他程序集文件一起打包和部署。
  • CSC.exe也允许将资源合并到编译器生成的程序集中。/resource开关将指定的资源文件嵌入最终生成的程序集PE文件中,并更新ManifestResourceDef表。/linkresource开关在ManifestResourceDef和FileDef清单表中添加记录项来引用独立存在的资源文件。

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")].

猜你喜欢

转载自www.cnblogs.com/long612-/p/12060613.html