有些共用的DLL,想要給多個應用程式使用的話,可以將那些DLL到GAC之中。
那如果不想放到GAC之中要如何做呢?
有些共用的DLL,想要給多個應用程式使用的話,可以將那些DLL到GAC之中。
那如果不想放到GAC之中呢? 有朋友問一些核心函式庫希望放置在Client電腦上的D槽的固定位置而不要註冊進GAC
這時可以在config中設定assemblyBinding的probing,讓程式到那個目錄去找,而不需要跟應用程式同個目錄之中。
比如我有一個WindowsFormsApplication1.exe,有參考使用到PrjA.dll及PrjB.dll,則這2個檔案要放在exe的相同目錄之下。
如果想要將這些共用的DLL都放在H:\Temp目錄之下,而讓exe到那去Search的話,可設定probing的privatePath屬性,如下,
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="H:\Temp" />
</assemblyBinding>
</runtime>
</configuration>
這時,exe就可以順利正常執行!
如果只是要個別設定DLL的話,也可以使用dependentAssembly設定,如下,
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="PrjA" culture="neutral" />
<codeBase href="H:\TEMP\PrjA.dll"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="PrjB" culture="neutral" />
<codeBase href="H:\TEMP\PrjB.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
那這2個有什麼差別呢?
如果您設定dependentAssembly的話,會先優先使用它的設定!
另外,如果使用此設定,在VS.NET中執行,會發生以下的錯誤訊息,
無法載入檔案或組件 'PrjA, Version=2.1.0.0, Culture=neutral, PublicKeyToken=null' 或其相依性的其中之一。
在 Appbase 目錄外找到私用組件。 (發生例外狀況於 HRESULT: 0x80131041)
但是,如果直接Run執行檔是OK的哦!
另外,如果您的應用程式要重新導向不同的版本,可參考黑大的這篇「aspnet_compiler的ODP.NET參照版本問題」。
而使用probing的privatePath屬性,如果相同目錄可以找到的話,就會用程式執行目錄的DLL哦!
所以在使用上要注意一下哦!
而如果只是單單把DLL放在共同的Folder,則使用probing的privatePath屬性,應該就可達到目的了吧!
參考資料
.NET CLR Components—Resolving Names to Locations
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^