選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
2 分鐘閱讀時間 (436 個字)

[.NET]如何讓相同的DLL使用bin目錄的,而不要使用到GAC的呢?

train
如何讓相同的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'。

SNAGHTMLb7cd768
 
查看 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
 
本文也發表於亂馬客Blog
[SQL]安裝SQL Server 2012 Cluster - 1(環境準備)
[.NET]如何將Unicode的難字,要如何讓 Big5 編碼的HTML檔可以正常顯示?
 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/05/06, 週一

Captcha 圖像