【发布时间】: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