Globally Deployment Assembly 部署全局程序集(转)
(一)StrongName Assembly
Strongly Named Assembly是CLR唯一标识程序集的机制,包含4个特性:
·文件名(没有扩展名)
·版本号
·语言文化
·公有密钥标记
例如:MyTypes,Version=1.0.123.0,Culture=neutral,PublicKeyToken=1234567890123456
利用 SN.exe 产生一个公钥/私钥对
SN -k mycompany.keys
查看公钥
sn -p mycompany.keys mycompany.publickey
sn -tp mycompany.publickey
Microsoft (R) .NET Framework 强名称实用工具版本 1.1.4322.573 公钥为 公钥标记为 91e5e7845907a9e6 |
创建StrongName Assembly(using System.Relfection):
[assembly:AssemblyKeyFile("mycompany.keys")]
StrongName Assembly的元数据信息:
Assembly AssemblyRef #1 |
(二)GAC(Global Assembly Cache)
c:\windows\Assembly\GAC
使用工具GACUtil.exe来实现安装卸载:
安装一个StrongNameAssembly:
gacutil.exe /i myassembly.dll
卸载一个StrongNameAssembly:
gacutil.exe /u myassembly.dll
在DOS窗口下查看细节:
(三)引用StrongNameAssembly
我们发现安装DotNetFramwork的机器会有两份程序集文件,一份是在C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\zh-CHS中,另一份则是在GAC中。
目的是方便应用程序的引用和加载.
引用是指我们在编译程序的时候,如果需要引用别的程序集,则编译器会按照这样的目录查找:
(1)使用编译器的/reference指定的文件的完全路径,如果只是程序集名称,则继续寻找
(2)当前工作目录
(3)CLR所在目录(C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\zh-CHS)
(4)使用编译器的/lib指定的目录
(5)LIB环境变量指定的目录
加载是指应用程序运行的时候加载需要的程序集的路径(加载顺序在前面已经提到)
利用响应文件(.rsp)来设置编译器的命令开关:
例如,创建一个myproject.rsp文件:
/out:myproject.exe
/target:winexe
编译的时候使用这个文件
csc @myproject.rsp file1.cs file2.cs
那么就等于我们不用这个响应文件的命令行:
csc /out:myproject.exe /target:winexe file1.cs file2.cs
在C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322里面有个csc.rsp文件
# This file contains command-line options that the C# # Reference the common Framework libraries |
(四)StrongNameAssembly的防篡改特性
在安装StrongNameAssembly到GAC的时候,系统将会自动验证程序集是否被篡改,在从GAC加载的时候又一次以不同的方式验证,如果从别的非GAC目录加载,也会对程序集进行严密验证。
(五)延迟签名
为了防止私有密钥的泄漏,我们可以使用延迟签名技术(Delayed Singning).
(1)取得公有密钥的文件,并将下面两个特性加入到源代码:
[assembly:AssemlyKeyFile("MyCompanyPublicKey.keys")]
[assembly:AssemlyDelaySign(true)]
(2)生成Assembly的时候,执行下面的命令可以将Assembly安装到GAC中(一次操作即可)
SN.exe -Vr MyAssembly.dll
(3)打包部署应用程序时,取得公有/私有密钥对,执行命令:
SN.exe -R MyAssembly.dll MyCompanyKey.Keys
(4)执行下面的命令,恢复验证过程进行测试:
SN.exe -Vu MyAssembly.dll
作者: XuGang 网名:钢钢 |
出处: http://xugang.cnblogs.com |
声明: 本文版权归作者和博客园共有。转载时必须保留此段声明,且在文章页面明显位置给出原文连接地址! |