【问题标题】:Is it possible to switch application configuration file at runtime for .NET application?是否可以在运行时为 .NET 应用程序切换应用程序配置文件?
【发布时间】:2011-07-28 20:00:33
【问题描述】:

默认情况下,.NET 应用程序的配置文件以“exe 文件名”.config 命名。我想知道是否可以动态指定一个应用程序的配置。

例如,构建的应用程序是“foo.exe”。在运行时,配置文件是“foo.exe.config”。是否可以让它接受命令行参数以使用其他配置文件。因此,应用程序可以使用其他配置,如下所示。

foo.exe /config:bar.config

bar.config 用作配置文件而不是 foo.exe.config。

【问题讨论】:

    标签: c# .net configuration


    【解决方案1】:

    如果您只需要替换 AppSettings 部分,上述所有方法都可以正常工作。

    如果您必须使用不同的配置文件(所有部分)运行,您可能需要考虑使用主机启动应用程序,该主机为您的主应用程序创建应用程序域并根据您传入的参数设置不同的配置文件。

    这是对我有用的代码:

            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationBase = "file://" + System.Environment.CurrentDirectory;
            setup.DisallowBindingRedirects = true;
            setup.DisallowCodeDownload = true;
    
            if (args.Length != 0 && args[0].Equals("-test"))
            {
                setup.ConfigurationFile = "PATH_TO_YOUR_TEST_CONFIG_FILE";
            }
            else {
                setup.ConfigurationFile = "PATH_TO_YOUR_LIVE_CONFIG_FILE";
            }
    
            AppDomain domain = AppDomain.CreateDomain("FRIENDLY_NAME", null, setup);
            domain.ExecuteAssembly("YourMainApp.exe");
    

    【讨论】:

      【解决方案2】:

      来自 MSDN 的代码

      static void DisplayMappedExeConfigurationFileSections()
      {
          // Get the application configuration file path.
          string exeFilePath = System.IO.Path.Combine(
              Environment.CurrentDirectory, "ConfigurationManager.exe.config");
          // HERE !!!     
          // Map to the application configuration file.
          ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
          configFile.ExeConfigFilename = exeFilePath;
      
          Configuration config =
              ConfigurationManager.OpenMappedExeConfiguration(configFile,
              ConfigurationUserLevel.None);
      
          // Display the configuration file sections.
          ConfigurationSectionCollection sections = config.Sections;
      
          Console.WriteLine();
          Console.WriteLine("Sections in machine.config:");
      
          // Loop to get the sections machine.config.
          foreach (ConfigurationSection section in sections)
          {
              string name = section.SectionInformation.Name;
              Console.WriteLine("Name: {0}", name);
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        来自How to use Configuration.GetSection() and ConfigurationManager.OpenMappedExeConfiguration()

        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
        fileMap.ExeConfigFilename = @"C:\Inetpub\Test\Config\Dev.config";
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
        AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings");
        string ConfigVersion = section.Settings["ConfigVersion"].Value;
        

        【讨论】:

          【解决方案4】:

          是的,您需要使用 ExeConfigurationFileMap

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-04
          • 2021-09-07
          • 1970-01-01
          • 1970-01-01
          • 2016-01-05
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多