在 运行 次使用多个设置文件并 select 它们

Use multiple setting files and select them at run time

截至今天,我的项目中有一个 App.config 文件。

我在程序中使用我的配置设置是这样的:

ConfigurationManager.AppSettings["FileDir"];

其中 FileDirApp.config 中的设置,定义如下:

<appSettings>
  <add key="FileDir" value="C:\MyFolder" />
</appSettings>

在我的构建文件夹(DebugRelease)中,如果我的项目名为 MyProject.[=20=,文件将显示为 MyProject.exe.config ]

我想添加多个变量完全相同但值不同的相似配置文件,我想使用命令行参数指向配置文件,以便我可以重用相同的程序但设置不同.

如何告诉我的程序选择哪个配置文件?

通常的方法是根据构建配置应用转换文件。因此,您仍然只有一个配置文件,但根据构建的预期用途,它的构建方式有所不同。

像 SlowCheetah 这样的东西可以做到这一点,或者如果你使用像 octopus deploy 这样的东西来进行部署,那么它可以在部署时完成。

https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms

我会这样做:

<appSettings>
    <add key="WordV1" value="abc" />
    <add key="WordV2" value="def" />
    <add key="WordV3" value="ghi" />
</appSettings>

string word = ConfigurationManager.AppSettings["WordV" + user.version];

换一个解决方案怎么样,尤其是在说明之后:

As of today, I have an App.config file in my project.

为什么你没有自己的设置class?您可以使用代码中的一组默认设置来维护它——这比尝试维护多个 App.config 文件要干净得多。类似于:

[Serializable]
public class AppSettings
{
  public string FileDir { get; set; }

  public AppSettings()
  {
    FileDir = string.Empty;
  }

  public AppSettings(string fDir)
  {
    FileDir = fDir;
  }

  public void SetDefault()
  {
    FileDir = "SomeDefault";
  }
}

您可以有不同的实例,或者根据您需要执行的操作,您可以加载第二组设置:

m_dSettings = SettingsIO.GetSettings(Path.Combine(Application.StartupPath, "DefaultSettings.xml"));
m_cSettings = SettingsIO.GetSettings(Path.Combine(Application.StartupPath, "CustomSettings.xml"));
m_eSettings = new AppSettings("F:\Dir");

SettingsIO.WriteSettings(m_dSettings, Path.Combine(Application.StartupPath, "DefaultSettings.xml"));
SettingsIO.WriteSettings(m_dSettings, Path.Combine(Application.StartupPath, "CustomSettings.xml"));
SettingsIO.WriteSettings(m_eSettings, Path.Combine(Application.StartupPath, "ExtraSettings.xml"));

class 坚持以上:

using System.Xml.Serialization;
using System.IO;

public static class SettingsIO
{
  public static void WriteSettings(AppSettings settings, string settingsFilePath)
  {
    XmlSerializer serializer = new XmlSerializer(typeof(AppSettings));

    if (!Directory.Exists(Path.GetDirectoryName(settingsFilePath)))
      Directory.CreateDirectory(Path.GetDirectoryName(settingsFilePath));

    using (StreamWriter SW = new StreamWriter(settingsFilePath))
      serializer.Serialize(SW, settings);
  }

  public static AppSettings GetSettings(string settingsFilePath)
  {
    AppSettings m_Settings = null;

    if (File.Exists(settingsFilePath))
    {
      XmlSerializer serializer = new XmlSerializer(typeof(AppSettings));

      using (FileStream FS = new FileStream(settingsFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        using (StreamReader SR = new StreamReader(FS))
          m_Settings = (AppSettings)serializer.Deserialize(SR);
    }

    if (m_Settings == null)
      m_Settings = new AppSettings();

    return m_Settings;
  }
}