目录
正文
一、定义
l 通常扩展名是EXE或DLL的.NET可执行程序称为程序集。
二、程序集和一般的dll或exe有什么区别?
虽然扩展名相同,但.net程序集包含了元数据。
三、元数据
l 元数据描述了程序集中定义的所有类型及其成员的信息。例如方法、属性、事件和字段。
l 清单是数据集元数据的一部分,包含如下信息:
u 程序集的名称、版本、公钥和文化
u 属于该程序集的文件(如某个程序集包含三个文件:1个程序集和2个模块)
u 引用程序集(该程序集引用的其他程序集)
u 权限集
u 导出类型
四、为什么要使用程序集
.NET程序集是为以前内部DLL的DLL Hell提供的解决方案。
DLL Hell(DLL地狱)简介:
新安装的应用程序重写了另一个应用程序使用的 DLL,会发生应用程序中断的情况,因为安装程序不能正确地检查版本,或者版本设置不正确
假如某电脑上安装了一个应用程序A,该应用程序A使用X.DLL,一直正常使用。突然有一天该电脑上安装了一个新的应用程序B,该应用程序B中也使用X.DLL。安装应用程序B后,覆盖了应用程序A的X.DLL,因此应用程序A不能够正常使用。
五、如何解决DLL Hell
l 程序集可以是共享的,也可以是私有的。
l 私有程序集专门由您的应用程序使用,其他应用程序不能使用。私有程序集存储在与可执行文件相同的文件夹中,从而便于部署----不存在上述的问题。
l 共享程序集,多个应用程序可以同时使用这个程序集。为了防止DLL地狱,使用共享程序集有一些限制。首先,所有共享程序集都存储在称为全局程序集缓存(GAC)的特殊位置。其次,每个共享程序集必须有用于唯一标识自身的强名,从而其他程序集不会有与其相同的名称。详见全局程序集缓存(GAC)。
六、程序集结构
组成部分 | 说明 |
程序集元数据 | 描述程序集和它的内容。 |
类型元数据 | 定义从程序集导出的所有类型和方法。 |
MSIL(中间语言)代码 | 包含编译器编译的MSIL代码。 |
资源 | 包含应用程序使用的图标、图像、文本字符串以及其他资源 |
七、模块和程序集
l 可以将程序集拆分成多个模块,然后分别编译每个模块,接下来可以将这些模块编译成程序集。
l 模块的作用:
u 模块可以更快的启动程序集,因为并不是所有的类都在一个文件中。模块只在需要时加载。
u 使用模块的另一个原因是,每个模块可以使用不同的语言编写。
八、命名空间和程序集
命名空间完全独立于程序集。在一个程序集中可以有不同的命名空间,一个命名空间也可以分布在多个程序集中。
九、查看程序集
使用命令行工具ildasm来查看。(Visual Studio 2008 命令提示)
十、应用程序域
在.NET之前的技术中,进程用作应用程序之间的一个独立而安全的边界。在.NET结构中,应用程序有一个新的边界:应用程序域。多个应用程序可以运行在同一个进程的多个应用程序域中。
十一、理解加密技术
l 在加密技术的领域中,有两种主要类型的加密和解密算法:对称(私钥加密)和非对称(公钥加密)。
l 私钥加密:使用相同的密钥加密和解密需要加密的消息。
l 公钥加密:需要生成由私钥和公钥组成的密钥对。密钥对工作方式:只可以使用对应的私钥解密通过公钥加密的消息。
十二、私有程序集
私有程序集位于应用程序所在的目录下,或其子目录中。私有程序集是构建程序集的一般方式,特别是应用程序和组件在同一个公司中建立时,就更是如此。
十三、共享程序集
1、创建共享程序集
(1)、创建强名
A. 强名由下列项组成
■ 程序集本身的名称
■ 版本号
■ 公钥(保证强名是独一无二的)
■ 文化
B. 使用vs创建强名
项目属性à签名à选择”为程序集签名”à新建(图1)à指定存储密钥对的文件名称(例如KeyFile.snk)(图2),也可以使用密码保护该文件。
图1
图2
(2)、版本化
使用vs编辑程序集版本
编辑项目的Properties下的AssemblyInfo.cs文件。该文件的AssemblyVersion属性标识程序集的版本号。如图3
图3
(3)、生成程序集
生成项目,以使vs2008生成共享程序集,并且使用强名签名该程序集。
2、全局程序集缓存(GAC)
GAC是.NET程序集的中央储存库,所有应用程序可以共享该存储库。将共享程序集放入GAC有很多原因,其中一些原因如下:
(1)、安全性:要求使用加密密钥签名存储在GAC中的程序集。这就使人很难篡改您的程序集,例如恶意代码替换或插入您的共享程序集。
(2)、版本管理:相同程序集的多个版本都可以驻留在GAC中,从而每个应用程序可以查找并使用程序集的特定版本。这就可以帮助避免发生DLL Hell问题。
(3)、更快速的加载:程序集第一次安装到GAC时会被验证,从而不需要在每次从GAC加载时都对其进行验证。
GAC位于<windows_derectory>/Assembly下,在大多数情况下是C:/Windows/Assembly。
3、将共享程序集放入GAC中
将程序集拖放到<windows_derectory>/Assembly下(也可以使用命令:gacutil /i DLLName.DLL)。如果正常,应该可以在目录下看到程序集。右键属性可以查看程序集的信息。如图4
图4
4、使用共享程序集
新建一个项目ProjectA,以引用私有程序集的方式引用共有程序集(假如为SharedDemo.DLL)(添加引用)。生成ProjectA,在bin目录下不会找到SharedDemo.DLL,因为它是共享程序集。