程序集,对于C#程序员来说一定不陌生,不就是VS生成的那些exe,dll么。是的,程序集(.net中exe与dll的区别就是exe有程序接入口, 即Main函数)就是.net框架下,可以被CLR加载并运行的一堆数据集(类似java中的jar包,无法脱离虚拟机自己运行)。它们和之前C\C++ 生成的可执行程序和动态链接库有本质的区别。

 

说了半天,程序集里到底有什么呢。作为一堆数据集,程序集的数据可以分为:类型元数据,程序元数据,IL代码,资源。

  先说下什么是元数据,元数据一般就是指描述自身的数据。

  程序集元数据:包含程序集的版本信息,安全信息,签名等。

 
类型元数据:记录了程序集将引用了哪些类,用户自定义了哪些类,字段,数据类型等一系列信息(VS的编程助手靠的就是反射获取类型元数据)。

 
IL代码:MSIL,微软中间语言,微软跨语言的根基所在,所有的C#代码都编译成IL代码,保存在程序集中,在被CLR加载后,由JIT调用BCL,FTL即时编译成机器码来让CPU运行。

  资源:图片,视频,音频不一而足。
 
   那么为什么程序集要包含这么多数据呢?有没有想过?
   其实程序集是完全自我描述性的,它是一个逻辑单元,而不是一个物理单元。它包含程序的元数据,这样就可以被其他的应用程序或者程序集直接调用,而不需要像以前的COM组件一样要去指定注册表或其他数据源。而且,即使程序集分散在几个不同的地方,也不会造成因为各个文件信息不同步而调用错误的情况,因为包含程序集入口的文件也包含了其他文件的位置,散列和内容。若一个文件被替换,在加载的时候会被检测出来,拒绝程序集加载。