程序集 (CLI)

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

CLI程序集可分为两类：进程程序集（EXE）、库程序集（DLL）。
 
一个程序集可包含一个或多个文件。代码文件成为模块（module）。

程序集名字
程序集名字包括4部分：

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

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

引用程序集
通过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函数再返回。

参见
Manifest (CLI)

参考文献

通用语言基础设施