为什么我的应用程序总是使用最新的GAC版本而不是引用的版本?

时间:2012-05-22 10:58:44

标签: .net reference version gac publisher-policy

上下文

我在GAC,版本1.0和版本2.0中安装了2个不同版本的程序集。我创建了一个引用1.0作为特定版本的应用程序。

问题

当我运行我的应用程序时,它将始终加载版本2.0,而应用程序专门引用版本1.0。

问题

为什么会这样? 如何强制我的应用程序加载已编译的版本?

在我看来,这与绑定重定向无关,因为我的应用程序在构建它时甚至不知道版本2.0,并且引用“特定版本”元数据设置为true。

感谢。


修改

我引用的程序集实际上是来自ODAC程序包的Oracle.DataAccess。我注意到其他名为Policy.x.xxx.Oracle.DataAccess的程序集在GAC中发布。


编辑2:

在查看Oracle.DataAccess策略后,我找到了定义绑定重定向的配置:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="4.112.3.0"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

即使我将反向绑定重定向添加到我的应用程序配置中,GAC中的策略似乎也具有优先级。 我找到了一个MSDN article来处理这个主题并建议忽略这个配置的策略:

<publisherPolicy apply="no" />

但它仍然不起作用......


编辑3:

我尝试从GAC中删除该策略并重新启动我的计算机。它终于奏效了。它不像一个舒适的解决方案开发,但这个政策确实打破了我的一个应用程序,这意味着在我的情况下禁用该策略是正确的。


最终修改:

伊戈尔给了我正确的答案。要解决这些策略,我所要做的就是使用正确的配置部分中的publisherPolicy设置:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
      <publisherPolicy apply="no"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

1 个答案:

答案 0 :(得分:7)

编辑完问题后,很明显这是影响装配绑定的策略文件。

对于Oracle,有一个名为Policy.X.Y.Oracle.DataAccess.config的文件,其内容与此类似:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="10.1.0.000-10.2.0.100" newVersion="10.2.0.100"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

该策略由Oracle安装程序安装,并将Oracle.DataAccess.dll重定向到最新版本,因为Oracle认为该库是向后兼容的。

编辑:如果您不希望将发布商政策应用于特定程序集的 ,请将该元素放在元素中:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="myAssembly" publicKeyToken="..."  culture="en-us" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
            <publisherPolicy apply="no" />
    </dependentAssembly>
</assemblyBinding>