强命名程序集
对于一个强命名的程序集,CLR通过以下信息来唯一标识它:
- 文件名,但不包括扩展名
- 版本号 Version
- 文化 Cultrue
- 公钥的散列值 PublicKeyToken
强名称程序集通过使用私钥以及程序集本身生成,此私钥对应于与该程序集一起发布的公钥。程序集包括程序集清单,此清单包含所有组成改程序集的文件的名称和哈希,具有相同强名称的程序集应该完全相同。
可通过许多方法为程序集签署强名称
- 在 Visual Studio 中,通过使用项目的“属性”对话框中的“签名”选项卡。 这是为程序集签署强名称的最简单且最方便的方法。
- 通过使用程序集链接器 (Al.exe) 将 .NET Framework 代码模块(.netmodule 文件)与密钥文件链接。
- 通过使用程序集特性将强名称信息插入代码中。 你可以使用 AssemblyKeyFileAttribute 或 AssemblyKeyNameAttribute 特性,具体取决于要使用的密钥文件所在的位置。
- 通过使用编译器选项。
程序集的名称存储在元数据中。强名称程序集有一个完全限定的名称,由程序集的名称、区域性、公钥及版本号组成。 该名称通常称为显示名称,对于加载的程序集,可通过使用 FullName
属性来获得它.
要在全局程序集缓存中查看一个程序集的完全限定名,可以使用Gacutil.exe
工具
多文件程序集
多文件程序集只能有一个入口点,即使程序集有多个代码模块。
创建多文件程序集的原因:
- 合并用不同语言编写的模块
- 将不常用的类型放在只在需要时才下载的模块中,优化应用程序的下载
- 合并由几个开发人员编写的代码模块。 虽然每一位开发人员都可以将各个代码模块编译成程序集,但这样会强制一些类型公开(如果所有模块均放在多文件程序集中,则不会公开)。
可以将包含程序集中其他模块的引用的命名空间的所有文件编译成代码模块。代码模块的默认扩展名为.netmodule
编译使用的命令: csc /t:module 文件名.cs
将代码模块添加到程序集中:csc /addmodule:文件名.netmodule /t:exe client.cs
公共语言运行时中的类型转发
使用类型转发可以将类型移到另一个程序集,而不必重新编译使用原始程序集的应用程序。
转发类型的4个步骤:
-
将类型的源代码从原始程序集移到目标程序集
-
在该类型原来所属程序集中,为被移动的类型添加
TypeForwardedToAttribute
。如下:[assembly:TypeForwardedToAttribute(typeof(Example))]
-
编译现在包含该类型的程序集
-
重新编译该类型原来所属的程序集,其中带有对现在包含该类型的程序集的引用