Dot-Net

為什麼我的應用程序總是使用最新的 GAC 版本而不是引用的版本?

  • May 22, 2012

語境

我在 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>

引用自:https://stackoverflow.com/questions/10700669