转:https://www.mgenware.com/blog/?p=176
1. 单个程序集配置重定向
当单个依赖程序集,比如A,依赖程序集B,比如使用B的1.0版本。现在B从1.0升级到了2.0。那么此时可以在程序集A中手动重定向B的版本,这样在程序集A运行后会自动使用更新的2.0版本的程序集B。
程序集的版本重定向须写在程序集自己的配置文件中(App.config)。在<configuration> – <runtime> – <assemblyBinding> – <dependentAssembly>
元素下。首先必须需要一个<assemblyIdentity>
元素来指定依赖的(引用)程序集。包括它的名称,公钥标记等……。接着就是<bindingRedirect>
元素代表重定向信息,使用<bindingRedirect>
的oldVersion和newVersion属性来指定新旧版本的信息。
比如如下配置文件代码(应用在程序集A的配置文件:a.exe.config中):
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<!-- 依赖程序集标识 -->
<assemblyIdentity name="B"
publicKeyToken="39e0cba45e0a8bc2"/>
<!-- 重定向信息 -->
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
2. 发行者策略程序集
还是上面的实例,如果用标题1的方法的话,每一个引用B旧版本的程序集,都需要手动配置自己的把依赖的版本1的B程序集重定向成版本2的B程序集。显然不是个好的方法。.NET还提供发行者策略(Publisher Policy)。其实就是把针对某个程序集的配置直接跟随程序集编译,然后在部署时,程序集和发行者策略都会存储在GAC里,这样任何引用该程序集的对象都会受到影响,而不用一个一个慢慢配置了。
创建开发者策略程序集需要使用al.exe的/link参数来制定一个发行者策略文件。具体可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/dz32563a.aspx
接下来还有一个问题,既然发行者策略程序集创建成功,那么所有使用它的程序集都会根据发行者策略而受到影响,某些时候程序集不需要受到发行者策略影响。则需要在<assemblyBinding>
元素下加入,<publisherPolicy>
元素,用apply属性来控制是否应用发行者策略配置。
如下代码:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- 不应用发行者策略配置 -->
<publisherPolicy apply="no"/>
</assemblyBinding>
</runtime>
</configuration>
3. 开发测试中频繁版本更新
第三个情景就是在程序集的开发测试中,往往频繁更新版本,此时则需要设置发行者策略配置并将程序集安装到GAC内。那么可以将程序集所在目录设置到Windows环境变量DEVPATH中。然后在machine.config(注意是machine.config,不是app.config)中打开开发模式(通过<developmentMode>
节点),这样CLR在寻找程序集时不仅要浏览GAC,还是探索DEVPATH中的目录,程序集就不必总安装到GAC中了。
在machine.config中加入:
<configuration>
<runtime>
<developmentMode developerInstallation="true"/>
</runtime>
</configuration>