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

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

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^