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

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

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

4

3 回答 3

4

当 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;
        }
    }
于 2012-11-29T21:08:34.620 回答
1

您需要的是自定义SettingsProvider。您的本地应用程序的默认设置是LocalFileSettingsProvider,它从与 appname.exe 位于同一目录中的 appname.exe.config 文件获取设置。您也许可以创建一个派生自 的类LocalFileSettingsProvider,该类在不同的目录中查找。如果做不到这一点,你将不得不从SettingsProvider.

另请参阅ApplicationSettingsBase.Providers 属性

于 2012-11-27T15:16:21.883 回答
1

如果您的应用程序中没有线程/后台任务,Ricibob 的解决方案可以正常工作。如果您确实拥有它们,则会导致问题。此外,您可以在一行中实现上述解决方案:

 AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", YOUR_CONFIG_LOCATION);
于 2016-03-15T21:39:56.170 回答