陈斌彬的技术博客

Stay foolish,stay hungry

关于部属程序集时的重定向版本(转)

转: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>