当 app.config 中有一个 configSection 时,Jims 解决方案是干净的。在我们的例子中,我们有几个 configSection(用于应用程序、库、nlog 等),我们只想从新位置加载整个文件。从原始问题来看,这并不是很清楚。
最简单的方法似乎是使用带有 AppDomainSetup 对象的新 AppDomain,在该对象上我们将 ConfigurationFile 属性设置为新配置文件的路径。
那么问题是何时以及如何创建新的应用程序域。 这篇文章提供了一个优雅的解决方案,似乎只需稍作修改即可工作。
1:添加启动事件处理程序:
Application x:Class="InstallTool.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml"
Startup="AppStartup"
2:在该处理程序中(在默认应用程序域中)创建一个新的应用程序域 - 其创建只是递归调用 Startup 事件处理程序。当新的应用程序域以(应用程序关闭)结束时,它会在“外部”应用程序域中中止启动。这避免了必须进行跨应用程序域调用或使用引导程序应用程序来创建新的应用程序域。
public void AppStartup(object sender, StartupEventArgs e) {
if (AppDomain.CurrentDomain.IsDefaultAppDomain()) {
string appName = AppDomain.CurrentDomain.FriendlyName;
var currentAssembly = Assembly.GetExecutingAssembly();
// Setup path to application config file in ./Config dir:
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = System.Environment.CurrentDirectory;
setup.ConfigurationFile = setup.ApplicationBase +
string.Format("\\Config\\{0}.config", appName);
// Create a new app domain using setup with new config file path:
AppDomain newDomain = AppDomain.CreateDomain("NewAppDomain", null, setup);
int ret = newDomain.ExecuteAssemblyByName(currentAssembly.FullName, e.Args);
// Above causes recusive call to this method.
//--------------------------------------------------------------------------//
AppDomain.Unload(newDomain);
Environment.ExitCode = ret;
// We get here when the new app domain we created is shutdown. Shutdown the
// original default app domain (to avoid running app again there):
// We could use Shutdown(0) but we have to remove the main window uri from xaml
// and then set it for new app domain (above execute command) using:
// StartupUri = new Uri("Window1.xaml", UriKind.Relative);
Environment.Exit(0);
return;
}
}