CLR:共享程序集和强命名程序集(下)
CLR:共享程序集和强命名程序集(下)
延迟签名
延迟签名允许我们只用公钥来生成一个程序集,引用了程序集的那些程序集会在它们的AssemblyRef表元数据记录项中嵌入正确的公钥值,便于将程序集正确的放到GAC的内部结构中。
这样程序集会失去防篡改的保护,文件内容也不会进行哈希处理。
使用延迟签名技术来开发程序集的步骤如下:
1. 开发一个程序集时,获取包含公钥的一个文件,并使用/keyfile和/delaysign编译器开关来编译程序集。
2. 生成程序集之后,执行下面这一行代码
SN.exe –Vr MyAssembly.dll
使CLR信任程序集的内容,而不执行哈希处理,也不对哈希值进行比较。这允许我们将程序集安装到GAC中。注意:在每台机器上,以上命令只需要执行一次即可。
3. 准备好打开和部署程序集时,获取私钥,然后执行下面这一行代码
SN.exe –R MyAssembly.dll MyCompany.PrivateKey
4. 为了在实际环境中测试,要执行以下命令行,重新打开验证。
SN.exe –Vu MyAssembly.dll
私有部署强命名程序集
在GAC中安装程序集优势:
1. GAC允许许多应用程序共享程序集
2. 通过发布者策略来使用新版本的程序集
3. 不同版本并行管理
强命名程序集除了部署到GAC中,或者以私有方式部署之外,还可以部署到只有少数应用程序才知道的某个目录(不建议使用)。
CLR如何解析类型引用
CLR可能在下面三个地方找到类型:
同一个文件
不同的文件,但同一个程序集
不同的文件,不同的程序集
高级管理控制(配置)
<?xml version=”
<configuration>
<runtime>
<assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v
<probing privatePath=”AuxFiles;bin\subdir” /> 发布者策略不包含此元素
<dependentAssembly>
<assemblyIdentily name=”JeffTypes” publicKeyToken=”32ab4ba45e
<bindingRedirect oldVersion=”
<codeBase version=”
<publicsherPolicy apply=”no” /> 指定忽略发布者策略程序集
</dependentAssembly>
<assemblyBinding>
</runtime>
</configuration>
codeBase元素 也能与弱命名程序集一起使用,但会忽略版本号;它所指定的URL必须引用应用程序基目录下的一个子目录。
publisherPolicy元素 如果生成JeffTypes程序集的组织部署了一个发布者策略文件,apply为no,则指示CLR忽略发布者策略程序集。
创建发布者策略程序集:
AL.exe /out:Policy.1.0.JeffTypes.dll /version:
/out 开关指示AL.EXE创建一个新的PE文件。程序集的名称很重要:第一部分(Policy)告诉CLR该程序集包含发布者策略信息;第二和三部分(1.0)用于major和minor版本号;
/linkresource 开关指示AL.exe将XML配置文件视为程序集的一个单独的文件。
发布者策略程序集必须安装到GAC中。只有在部署程序集的bug修正版本或者Service Pack版本的时候,才应创建一个发布者策略程序集。执行应用程序的全新安装时,不应该安装发布者策略程序集。