为什么我的应用程序总是使用最新的GAC版本而不是引用版本?
-
13-12-2019 - |
题
上下文环境
我在GAC中安装了2个不同版本的程序集,版本1.0和版本2.0。我做了一个引用1.0作为特定版本的应用程序。
问题
当我运行我的应用程序时,它将始终加载版本2.0,而应用程序专门引用版本1.0。
问题
为什么会这样?如何强制我的应用程序加载它已编译的版本?
在我看来,这与绑定重定向无关,因为我的应用程序在构建它时甚至不知道版本2.0,并且引用"特定版本"元数据设置为true。
谢谢.
编辑:
我引用的程序集实际上是Oracle。来自ODAC包的DataAccess。我注意到其他程序集命名为Policy。X.xxx.Oracle.DataAccess发表在GAC。
编辑2:
在调查了神谕之后。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文章 使用此配置处理主题并建议忽略策略:
<publisherPolicy apply="no" />
但它仍然不起作用。..
编辑3:
我试图从GAC中删除策略并重新启动我的机器。它终于奏效了。它感觉不像是一个confortable解决方案开发,但这个策略确实破坏了我的一个应用程序,这意味着禁用策略是在我的情况下做的正确事情。
最终编辑:
伊戈尔给了我正确的答案。为了解决这些政策,我所要做的就是使用 publisherPolicy
设置在正确的配置部分:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<publisherPolicy apply="no"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
解决方案
编辑您的问题后,很明显这是影响程序集绑定的策略文件。
在Oracle的情况下,有一个名为Policy的文件。X.Y.甲骨文。数据存取。配置与此类似的内容:
<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>