如何讓相同的DLL使用bin目錄的,而不要使用到GAC的呢?
我們有個專案,使用一個共用的 DLL ,因為新增加功能,所以將原有的版本號,從 2.0.3500.9 改成了 2.0.3500.10。
而這個專案要部署到另一個環境時,裡面其他的系統所使用的是舊的版本,而且也都在 GAC 之中,包含 policy 。
正常的作法是將新的放到 GAC 之中,包含 policy 。但因為某些因素,沒能這樣做 ~~~
所以這個專案一執行就發生 System.TypeLoadException 的錯誤,如下,
無法從組件 'myDLL, Version=2.0.3500.9, Culture=neutral, PublicKeyToken=5298a1bd3421ecdc' 載入型別 'myDLL.newFeature'。
查看 Publisher Policy 中的 bindingRedirect 設定是從 2.0.0.0-2.0.65535.65535 都是是使用 2.0.3500.9 這個版本(一般會是取 組件名.config ),
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myDLL" publicKeyToken="5298a1bd3421ecdc" culture="neutral" />
<bindingRedirect oldVersion="2.0.0.0-2.0.65535.65535" newVersion="2.0.3500.9"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
所以就會 Load 到 GAC 中的 DLL , 而不是在 bin 目錄的 2.0.3500.10 這一版。那要怎麼辦呢?
測試發現,只需要設定 bindingRedirect 及設定 publisherPolicy apply 為 no ,如下,
雖然專案使用的是新版本的(2.0.3500.10),但因為 GAC 有,所以系統還是會先從 GAC 去 Load 進來(詳細可以參考Assemblies: locating, binding and deploying),所以還是會發生錯誤!
所以我們的專案需要在 config 檔(app.config or web.config)中設定讓它 binding 到新的版本,如下,
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myDLL"
publicKeyToken="5298a1bd3421ecdc"
culture="neutral" />
<bindingRedirect oldVersion="2.0.3500.10"
newVersion="2.0.3500.10"/>
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
這樣就可以讓目前這個專案使用Bin目錄的新的版本,而不會使用到 GAC 的舊版本DLL。
參考資訊
Assemblies: locating, binding and deploying
How to: Create a Publisher Policy
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^