[From 3.1~3.4]
一.CLR支持两种程序集:弱命名程序集(weakly named assembly)和强命名程序集(strongly named assembly).
两种部署方式:私有或全局
私有:私有部署的程序集是指部署到应用程序基目录或者某个子目录的程序集。
全局:全局部署的程序集是指部署到一些公认位置的程序集。
GUID(Globally Unique Identifier,全局唯一标识符),
URL(Uniform Resource Locator,统一资源定位符)
URN(Uniform Resource Name,统一资源名称)
二.创建强命名程序集
1.使用.NET Framework SDK 和Microsoft Visual Studio随带的Strong Name实用程序(SN.exe)获取密钥。
命令行:SN -k MyCompany.snk
这告诉SN.exe创建MyCompany.snk。
另,下面时查看公钥的方法分两步
SN -p MyCompany.snk MyCompany.PublicKey sha256(创建直喊公钥的文件MyCompany.PublicKey,sha256是算法名字)
SN -tp MyCompany.PublicKey(传递只含公钥的文件)
2.创建强签名程序集
csc /keyfile:MyCompany.snk Program.cs
C#编译器看到这个开关会打开制定文件(MyCompany.snk),用私钥对程序集进行签名,并将公钥嵌入清单。注意只能对含清单的程序集文件进行签名:程序集其他文件不能被显式签名。
三.全局程序集缓存(一定是强命名程序集)
由多个应用程序访问的程序集必须放到公认的目录,而且CLR在检测到对该程序集的引用时,必须知道检查该目录。这个公认位置就是全集程序集缓存(Global Assembly Cache,GAC)。GAC的具体位置是一种实现细节,不同版本会有所变化。但是,一般能在一下目录发现它:
%SystemRoot%\Microsoft.NET\Assembly
GAC目录式结构化的:其中包含许多子目录,子目录名称用算法生成。
不要直接将程序集手动复制到GAC目录;要用工具完成这件事情。开发和测试在GAC中安装强命令程序集最常用的工具是GACUtil.exe。如果直接运行,不添加任何命令行参数,就会自动显示用法:
四.在生成的程序集中引用强命名程序集
若使用csc.exe的/reference开关想引用的程序集文件名
如果文件名时完整路径,则会加载指定文件,并根据它的元数据生成程序集。
如果不包含路径的文件名,csc.exe会尝试一下目录查找程序集(按所列顺序)
1.工作目录。
2.csc.exe所在目录,目录中还包含CLR的各种DLL文件,
3.使用/lib编译器开关指定的任何目录。
4.使用LIB环境变量指定的任何目录
安装.Net Framework时,实际安装Micrsoft 的程序集的两套拷贝
1.编译器的CLR目录
用处:方便生成程序集
特点:1.不依赖机器(只包含元数据)
2.GAC的子目录
用处:方便运行时加载程序集
特点(同时包含元数据和IL代码)