程序集 (CLI)

通用语言基础架构 (CLI) 中的程序集,也译作“装配件”,是编译得到的,供CLR进一步编译执行的代码库。代码是用通用中间语言(CIL)表示,在运行时即时编译机器语言。在.NET Framework实现中,这种即时编译通用语言运行时 (CLR)的一部分。

CLI程序集可分为两类:进程程序集(EXE)、库程序集(DLL)。

一个程序集可包含一个或多个文件。代码文件成为模块(module)。

程序集名字

程序集名字包括4部分:

  1. 短名字。对于Windows系统,是指PE文件名字,不包括文件扩展名。
  2. culture。RFC 1766定义的locale的标识符。一般应是culture中立的。culture只用于satellite程序集
  3. 版本号。点分隔的数字,由4部分组成:major, minor, build, revision
  4. 公钥token。公钥的64比特哈希值,用于签名[1]该程序集。一个签名的程序集称为“强名字”(strong name)。者能预防程序集重名。由于FAT32NTFS只识别PE文件名,因此CLI引入了全局程序集缓存(GAC)处理运行时单个文件夹被映射为不同的嵌套的文件夹系统。

程序集版本

CLI程序集可以用版本信息,以避免由于共享的程序集版本差别引起的应用程序冲突。[2] However, this does not eliminate all possible versioning conflicts between assemblies.[3]

引用程序集

通过C#编译器的/reference标记,可以引用一个可执行代码库。

程序集延迟签名

一个共享程序集是强名字的,但在开发时不产生私钥,仅当部署时才产生私钥。

程序集的语言

程序集编译为CIL代码,这是一种中间语言。框架内部把CIL字节码转换为本地的汇编代码。对于打印"Hello World"的程序,其等效的CIL代码是:

 .method private hidebysig static void  Main(string[] args) cil managed {
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       11 (0xb)
  .maxstack  1
  IL_0000:  ldstr      "Hello World"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000a:  ret } // end of method Class1::Main

CIL代码装入String到运行栈,然后调用WriteLine函数再返回。

参见

参考文献

  1. ^ Giving a .NET Assembly a Strong Name. [2019-07-04]. (原始内容存档于2012-02-24). 
  2. ^ Truche, Philippe. .NET Assembly Versioning Lifecycle. 2008-08-12 [2008-09-21]. (原始内容存档于24 October 2008). 
  3. ^ Pierson, Harry. DLR Namespace Change Fire Drill. 2008-09-17 [2008-09-21]. (原始内容存档于1 November 2008).