利用.net框架简化发布和解决dll hell问题(6)
术语“签名”常常联想到 microsoft authenticode。理解共享名和 authenticode 没有任何关系是非常重要的。这两个技术有不同的目标。实际上,authenticode 意味着对发行者信任的水平,而共享名不是。没有与强名称相关联的授权许可或第三方签名授权。另外,共享名签名通常由编译器本身作为编译过程的一部分进行。但是,也有实用程序用于在 sdk 中签名。
另一个值得考虑的是“测试签名”工程。汇编的编写者经常不能访问需要完全签名的专有密钥。大多数公司很好的保护这些密钥的存储它只能被少数人访问。结果,.net 框架提供少量在开发中的“测试签名”技术,然后再“真实签名”。
版本策略
如刚刚所描述的,每个汇编清单记录它创建所依赖的每个关系的版本信息。但是,有一些方案应用程序的编写者或管理员需要在运行时以关系的不同版本运行。例如,管理员应该能发布故障排除版本而不需要重新编译每个应用程序以便得到该修改。而且,管理员必须能列出因发现安全漏洞或服务故障从没有使用的汇编的详细版本。.net 框架通过版本策略在版本绑定中启用了该灵活性。
汇编版本号
每个汇编都有四个部分组成的版本号作为它标识的一部分(就是说,一些汇编的版本 1.0.0.0 和 版本 2.1.0.2 是完全不同的与类装载器有关的标识)。包括作为标识的一部分的版本主要用来区分用于并行目的的汇编的版本。
开发人员和管理员必须理解版本号的结构,因为它是通用语言运行时间如何加强汇编之间的版本关系的关键。
<img src="/files/bpic/2006-10/7/0610717102927373.gif"">
图 6. 汇编版本号的四个部分
版本号的几个部分是主要版本、次要版本、内部版本和修订版本。主要版本或次要版本的改变可认为是不可兼容的改变。例如,开发人员改变了一些方法参数的类型或彻底删除了一些类型。类装载器使用该信息使所依赖汇编的不兼容版本不默认载入。
另一方面,仅改变版本号中的建立和版本部分可认为是兼容的。这些改变一般是故障排除或安全补丁,在这种情况下类型定义没有在某种程度上中断调用者的改变,这是兼容的。这些兼容的变化经常称为 quick fix engineering (qfe) 修复或动态修复。
默认的版本策略
当通用语言运行时间遇到在代码中引用汇编时,它决定载入所依赖汇编的版本。默认情况下,载入解决引用的汇编必须有与引用中的记录相同的主版本号和次版本号。如果这些号码不同,该汇编认为是不兼容的,并且不会默认载入。相反,通用语言运行时间会用最高的号码得到 qfe (或动态修复)。
例如,如果 main 以 mylib 的 1.0.0.0 版本编译,当运行发现 mylib 的 1.0.1.1 版本时,将载入 1.0.1.1。
总是取最新的编译和版本的策略称为“自动 qfe 策略”。该原则的主要目的是允许管理员在不重新创建所有应用程序的情况下发布故障排除版本。
定制版本策略
有些时候前面描述的默认策略并不是您所要的。例如,也许应用程序被所安装的 qfe 不经意地中断了。
默认的版本策略能通过使用 xml 配置文件修改。关于版本,有两个文件:一个应用程序说明文件和一个机器范围或管理员文件。应用程序说明文件保存在与应用程序相同的目录中。该文件中的策略描述只影响该应用程序。机器范围策略文件当前保存在 windows 目录。该文件被管理员用来描述影响本机器上所有应用程序的策略。例如,也许某个管理员确定了某个汇编的详细的版本具有一些安全漏洞,并且他确保该汇编将不再被使用。
自定义策略的示例包括:
绑定指定的版本
有时需要绑定一个与清单记录的版本完全不同的汇编。通过在配置文件中的<bindingpolicy>标签提供对该方案的支持。该策略用于映射某个关系指定版本的引用或某个关系所有版本的引用。
下面例子映射某个称为 calcr 的汇编 6.0.0.0 版本的引用: