gpt4 book ai didi

c# - 从与应用程序二进制目录不同的位置加载 WPF app.config/MyApp.exe.config

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:00 25 4
gpt4 key购买 nike

  1. 我想从应用程序 bin 文件夹的子文件夹而不是应用程序 bin 文件夹本身(例如 ./Configs/MyApp.exe.config)加载 MyApp.exe.config。
  2. 我不想使用 System.Configuration 对象(由 ConfigurationManager.OpenExeConfiguration(configPath) 返回),因为这只是一个字符串映射。我想继续使用现有生成的设置:设置中的 ApplicationSettingsBase 对象.Designer.cs,因为它已将设置值转换为适当的对象。

即我只想重定向“设置”加载自身的位置。我环顾四周,我所能找到的都是涉及直接使用 System.Configuration 对象的解决方案 - 但如何将其重新连接到设置?

想要做的事情似乎是合理的 - 不明白为什么它看起来如此困难?欢迎任何解决方案!

最佳答案

当您在 app.config 中只有一个 configSection 时,Jims 解决方案是干净的。在我们的例子中,我们有几个 configSections(用于应用程序、库、nlog 等),我们只想从新位置加载整个文件。从最初的问题来看,这并不是很清楚。

最简单的方法似乎是使用带有 AppDomainSetup 对象的新 AppDomain,我们在该对象上将 ConfigurationFile 属性设置为新配置文件的路径。
接下来的问题是何时以及如何创建新的应用程序域。 This post提供了一个优雅的解决方案,似乎只需稍作修改即可使用。

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 事件处理程序。当使用 (app closed) 完成新的应用程序域时,它会在“外部”应用程序域中中止启动。这避免了必须进行跨应用程序域调用或使用 Bootstrap 应用程序来创建新的应用程序域。

    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;
}
}

关于c# - 从与应用程序二进制目录不同的位置加载 WPF app.config/MyApp.exe.config,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13584692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com