【问题标题】:Why does my application always uses the latest GAC version instead of referenced version?为什么我的应用程序总是使用最新的 GAC 版本而不是引用的版本?
【发布时间】:2012-05-28 20:43:40
【问题描述】:

上下文

我在 GAC 中安装了 2 个不同版本的程序集,1.0 版和 2.0 版。我创建了一个引用 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>

【问题讨论】:

  • 您是否检查过您引用的程序集没有发布者政策?
  • @IgorKorkhov:是的,我在 GAC 中找到了名为 Policy.x.xxx.MyAssemblyName 的内容。我不知道这种机制。我编辑了我的问题,您可以提交回复。谢谢。
  • 切题:是什么问题让你想用V1?我偶尔使用Oracle,所以预先警告是预先准备好的:)
  • @Ian:应用程序是使用 1.0 版构建的,而 2.0 版破坏了应用程序。

标签: .net reference version gac publisher-policy


【解决方案1】:

编辑问题后,很明显这是影响程序集绑定的策略文件。

如果是 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>

【讨论】:

  • 我尝试使用&lt;bindingRedirect oldVersion="4.112.3.0" newVersion="4.112.1.2"/&gt;,但没有解决问题。我读过here,我可以使用&lt;publisherPolicy apply="no" /&gt; 来忽略政策,但仍然是同样的问题......
  • @Ucodia:这很奇怪。您是否在应用程序中引用 v4.112.3.0?也许您应该尝试包含一系列版本(例如,0.0.0.0-4.65535.65535.65535),看看这是否可行?
  • 我特意参考了4.112.2.1。我用一些新发现更新了我的问题。看起来 GAC 中发布的策略会覆盖任何应用程序配置。
  • @Ucodia:确实,该策略确实覆盖了应用程序配置,但&lt;assemblyIdentity /&gt; 中的&lt;publisherPolicy apply="no" /&gt; 应该仍然有效。
  • 它在启用策略的情况下工作!我实际上是在错误的配置部分中定义了这个设置,因此没有使用该设置。非常感谢您的宝贵帮助。然后你应该更新你的答案:)
猜你喜欢
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多