2012年12月10日 星期一

加入探索目錄:引用位於非執行目錄下的DLL

20100507004.jpg
當程式寫到某一種程度時

就會參考許多動態連結函式庫(DLL)

參考的DLL一多,執行目錄下的DLL就會越來越多

看起來就會很雜亂

如何把DLL用資料夾分類就成了很重要的一件事情

那該如何做呢?



程式在啟動時,會先有CLR解析的動作

這個動作僅會對執行目錄進行搜尋

整個探索的過程又稱為Probing

因此程式所參考的DLL都必須存在於執行目錄中

否則程式就會無法載入所需的DLL

除了執行目錄外

如何新增一些搜尋目錄好讓程式能夠順利找到相關的DLL??


假設我們將所需的DLL分別放置在執行目錄下的dir1、dir2以及dir2中的dir3三個目錄下

可以透過下列兩種方法來設定:


一、app.config

在專案所屬的app.config

新增assemblyBinding元素

並設定其probing中的privatePath屬性即可

如下所示:
<?xml version="1.0"?>
<configuration>
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="dir1;dir2;dir2/dir3"/>
  </assemblyBinding>
</runtime>
</configuration>
加入了dir1、dir2、dir2/dir3等三個搜尋目錄

此時放在執行目錄中這三個目錄下的DLL就會被搜尋到!

但要注意的是這些必須是執行目錄的子目錄


二、AppDomain

另一種方式是透過程式撰寫來達到目的

但由於是透過程式撰寫

所以載入DLL的時間點就會依據你寫程式的位置來判斷

            AppDomainSetup setup = new AppDomainSetup()
            {
                ApplicationBase = @"C:\TestProject",    //執行目錄
                PrivateBinPath = @"dir1;dir2;dir2/dir3" //加入目錄
            };

            AppDomain currentDomain = AppDomain.CreateDomain("NewDomain", null, setup);
            currentDomain.Load("ReferenceDLL");
這裡透過currentDomain的Load的方法

便可動態載入位於設定目錄下的DLL


雖然這兩種方法皆可載入位於非執行目錄下的DLL

不過使用的時機略有不同

必須依造自己的需求來做選擇!!

1 則留言: