CLR Via C# 3rd 阅读摘要 -- Chapter 3 - Shared Assemblies and Strongly Named Assemblies
Two Kinds of Assemblies, Two Kinds of Deployment
1. 弱名称程序集和强名称程序集;
2. 两种类型程序集的部署方式:Privately、Globally。
Giving an Assembly a Strong Name
1. 强名称程序集的额外标识信息:Public Key;
2. sn.exe;
3. csc.exe /keyfile: ;
4. 因为公钥太长了,一个程序集可能会引用多个程序集,为了节省空间,采用8字节的Hash值作为token。但是CLR不使用token来验证,看起来方便些。
The Global Assembly Cache
1. 不能手动拷贝程序集文件到GAC中;
2. GacUtil.exe;
3. 可能的话尽量用Privately部署,而不是Globally部署在GAC。
Building an Assembly That References a Strongly Named Assembly
1. csc.exe查找程序集的策略:当前目录->csc.exe所在的目录->/lib指定的目录->LIB设定的目录(又看到一遍)。
Strongly Named Assemblies are Tamper-Resistant
1. 强名称程序集只能保证文件未被修改,并不意味着可以信任文件来源。
Delayed Deploy
1. SN.exe调用了CryptoAPI,保护私钥的最好办法是不在硬盘上停留,直接导出到硬件设备中,然后锁到保险柜中;
2. 为什么要延迟签名?(私钥的控制)
3. 延迟签名的原理;(占位先)
4. 延迟签名的步骤;
- csc /keyfile:MyApp.publickey /delaysign MyAssembly.cs;
- sn.exe -Vr MyAssembly.dll
- sn.exe -R MyAssembly.dll MyApp.privatekey
- sn.exe -Vu MyAssembly.dll
5. 延迟签名的注意事项
- 别忘了最后sn.exe -Vu或者-Vx;
- 可以用/keycontainer代替/keyfile,如果私钥在设备中;
- 如果要混淆以保护的话,必须先混淆再签名。
Privately Deploying Strongly Named Assemblies
1. 如果要部署程序集到GAC中,应用程序就不能绿色安装了 ;
2. 如果程序集不需要共享,还是不要部署到GAC中。
How the Runtime Resolves Type References
1. 在决定哪个引用类型时,CLR查找类型的3种类型:
- 同样的文件;
- 不同的文件,同样的程序集;装箱单的FileRef表
- 不同的文件,不同的程序集。
2. CLR支持类型迁移,比如System.TimeZoneInfo 从(System.Core.dll,.NET 3.5)到(MsCorLib.dll,.NET 4.0)。但是会影响已有的应用。
Advanced Administrative Control(Configuration)
1. 通过配置文件,管理员可以控制CLR装载哪一个版本的程序集。bindingRedirect,codeBase;
2. 有发行策略的程序集必须部署在GAC中;
3. 签名有发行策略的程序集,所有版本的签名密钥必须是同一对;
4. 别滥用发行策略,只有在发布更新或服务包时才使用。并严格测试兼容性;
5. publishPolicy apply="no"可以忽略发行策略。
本章小结
本章主要关注如何创建可以被多个应用程序使用的程序集。提出了几个问题并进行了分析:
1. 如何保证在修正bug或添加功能时不会破坏现有的应用程序?
2. 如何解决文件版本问题?
3. 如何创建强名称的程序集?
4. 如何发布程序集,CLR如何定位并加载程序集?
5. “registering”程序集到GAC的目的是什么?
6. 如何进行延迟签名以及延迟签名的作用是什么?
7. 如何在运行时决定类型引用?