有時候我們想讓程序的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>
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文件上,只想用代碼來實現,第二中方法發現已經過期,第三種方法MSDN語焉不詳的,網上也沒有什麼資料,目前就用第四種方法
4.AppDomain有個AssemblyResolve事件,加載dll失敗的時候觸發,可以在這個事件裏面處理
- AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
- /// <summary>
- /// 對外解析dll失敗時調用
- /// </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);
- }