有時候我們想讓程序的exe文件和dll文件分開在不同目錄,這時候可以有3種方法
1.在app.config中配置
- <runtime>
- <gcConcurrent enabled="true" />
- <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
- <publisherPolicy apply="yes" />
- <probing privatePath="32;64" />
- </assemblyBinding>
- </runtime>
1)全局DLL(在GAC中注冊,GAC——全局程序集緩存),有關GAC的詳細資料可以參考一下鏈接:
http://blog.csdn.net/prince_lintb/article/details/40789211
2)私有DLL,默認情況下,添加程序集引用的時候,程序集DLL會復制到可執(zhí)行目錄下。
對于私有DLL,當數(shù)目眾多時,由于沒有分類,會顯得比較凌亂。在發(fā)布軟件的時候也不希望在軟件安裝目錄下看到大量的dll文件。如果能將其分類放在不同的文件夾下就再好不過了。
問題是,如何解決應用程序?qū)LL的查找路徑問題呢?答案是在配置文件中添加如下配置項。
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<publisherPolicy apply="yes"/>
<probing privatePath="Common;Security"/>
其中privatePath是相對于*.exe.config文件的相對路徑,多個文件夾以分號分隔。
添加程序集DLL引用之后,將DLL的屬性“復制本地”設置為False。程序編譯過程中,會自動檢索Common和Security文件夾下的DLL及其依賴項。
2. AppDomain.CurrentDomain.AppendPrivatePath來設置 3.new AppDomainSetup().PrivateBinPath 來設置
- if (AppDomain.CurrentDomain.IsDefaultAppDomain())
- {
- string appName = AppDomain.CurrentDomain.FriendlyName;
- var currentAssembly = Assembly.GetExecutingAssembly();
- AppDomainSetup setup = new AppDomainSetup();
- setup.ApplicationBase = System.Environment.CurrentDirectory;
- setup.PrivateBinPath = "Libs";
- setup.ConfigurationFile = setup.ApplicationBase +
- string.Format("\\Config\\{0}.config", appName);
- AppDomain newDomain = AppDomain.CreateDomain("NewAppDomain", null, setup);
- int ret = newDomain.ExecuteAssemblyByName(currentAssembly.FullName, e.Args);
- AppDomain.Unload(newDomain);
- Environment.ExitCode = ret;
- Environment.Exit(0);
- return;
- }
可有時候又不想把他放在config文件上,只想用代碼來實現(xiàn),第二中方法發(fā)現(xiàn)已經(jīng)過期,第三種方法MSDN語焉不詳?shù)模W(wǎng)上也沒有什么資料,目前就用第四種方法
4.AppDomain有個AssemblyResolve事件,加載dll失敗的時候觸發(fā),可以在這個事件里面處理
- AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
- /// <summary>
- /// 對外解析dll失敗時調(diào)用
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
- {
- string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Libs\");
- path = System.IO.Path.Combine(path, args.Name.Split(',')[0]);
- path = String.Format(@"{0}.dll", path);
- return System.Reflection.Assembly.LoadFrom(path);
- }
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。