[.NET]將共用的DLL放在同一個目錄之中

有些共用的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:從零開始的軟體開發生活

請大家繼續支持 ^_^