為什麼我的應用程序總是使用最新的 GAC 版本而不是引用的版本?
語境
我在 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 文章處理該主題並建議使用此配置忽略策略:
<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>
編輯問題後,很明顯這是影響程序集綁定的策略文件。
對於 Oracle,有一個名為 Policy.XYOracle.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>