CLR via C#:共享程序集和强命名程序集

基础知识:如下所示:
1.程序集可以采取私有或全局两种部署方式。其中私有部署指的是部署到应用程序根目录或者子目录;而全局部署指的是部署到全局程序集缓存。由于全局部署没有对注册表进行操作,所以没法实现简单的安装,备份,还原,移动和删除应用程序,所以我们建议尽量使用私有而不是全局部署。

2.CLR支持弱命名和强命名两种程序集。区别如下所示:
1>.两种程序集的结构完全相同,唯一区别就是强命名程序集使用发布者的秘钥进行签名。
2>.弱命名程序集只能使用私有部署方式,而强命名程序集可以使用私有和全局两种部署方式。
3>.CLR查找弱命名程序集时会根据程序集名称(包含扩展名)从部署的位置处进行查找。
4>.CLR查找强命名程序集时会根据程序集名称(不包含扩展名),版本号,语言文化和公钥从部署的位置处进行查找。

创建强命名程序集:创建流程如下所示:
1>.使用vs提供的SN.exe工具创建签名文件。
创建命令如下所示:

// 生成包含公钥和私钥对的签名文件MyCompany.snk
SN -k MyCompany.snk
// 将签名文件MyCompany.snk中的公钥数据以sha256算法写入到公钥文件MyCompany.PublicKey中
SN -p MyCompany.snk MyCompany.PublicKey sha256
// 显示公钥文件MyCompany.PublicKey中的公钥和公钥标记(对公钥进行哈希处理的后8字节数据)
SN -tp MyCompany.PublicKey

2>.使用csc.exe工具中的/keyfile命令来对包含元数据清单表的PE文件进行签名。
签名命令如下所示:

// 编译Program.cs文件生成PE文件,然后使用MyCompany.snk签名文件对该PE文件进行签名
csc /keyfile:MyCompany.snk Program.cs

签名流程如下所示:
1>>.生成包含元数据清单表的PE文件后,会对PE文件的内容进行哈希处理从而得到哈希值。
2>>.将得到的哈希值使用签名文件中的私钥进行签名从而得到RSA数字签名。
3>>.将得到的RSA数字签名存储到PE文件的保留区域。
4>>.将签名文件中的公钥存储到PE文件中的程序集清单表中。
5>>.引用了其他的强命名程序集时,就会将引用程序集的公钥标记存储到程序集引用表的Public Key字段中。

全局程序集缓存:一般位于%SystemRoot%\Microsoft.NET\Assembly目录下。不要尝试在子目录里手动部署强命名程序集,因为子目录都是算法自动生成的,手动部署容易出错;此时可以使用GACUtil.exe工具来完成强命名程序集的部署操作。常见命令如下表所示:

命令 描述
/i 将某个强命名程序集安装到全局程序集缓存中。
/il 将一个或者多个强命名程序集安装到全局程序集缓存中。
/u 将某个强命名程序集从全局程序集缓存中卸载。
/ul 将一个或者多个强命名程序集从全局程序集缓存中卸载。
/l 列出通过指定程序集名字筛选出的全局程序集缓存。
/r 指定要安装或者卸载的跟踪引用。
/lr 列出通过指定程序集名字筛选出的全局程序集缓存以及所有跟踪引用。
/cdl 删除下载缓存的内容。
/ldl 列出下载缓存的内容。
/f 强制重新安装程序集。
/nologo 取消显示徽标版权标志。
/silent 取消显示所有输出。
发布了81 篇原创文章 · 获赞 39 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/zjz520yy/article/details/104431502
今日推荐