當程式寫到某一種程度時
就會參考許多動態連結函式庫(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
不過使用的時機略有不同
必須依造自己的需求來做選擇!!
Great article!很實用!
回覆刪除