在 运行 次使用多个设置文件并 select 它们
Use multiple setting files and select them at run time
截至今天,我的项目中有一个 App.config
文件。
我在程序中使用我的配置设置是这样的:
ConfigurationManager.AppSettings["FileDir"];
其中 FileDir 是 App.config
中的设置,定义如下:
<appSettings>
<add key="FileDir" value="C:\MyFolder" />
</appSettings>
在我的构建文件夹(Debug
或 Release
)中,如果我的项目名为 MyProject
.[=20=,文件将显示为 MyProject.exe.config
]
我想添加多个变量完全相同但值不同的相似配置文件,我想使用命令行参数指向配置文件,以便我可以重用相同的程序但设置不同.
如何告诉我的程序选择哪个配置文件?
通常的方法是根据构建配置应用转换文件。因此,您仍然只有一个配置文件,但根据构建的预期用途,它的构建方式有所不同。
像 SlowCheetah 这样的东西可以做到这一点,或者如果你使用像 octopus deploy 这样的东西来进行部署,那么它可以在部署时完成。
我会这样做:
<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;
}
}
截至今天,我的项目中有一个 App.config
文件。
我在程序中使用我的配置设置是这样的:
ConfigurationManager.AppSettings["FileDir"];
其中 FileDir 是 App.config
中的设置,定义如下:
<appSettings>
<add key="FileDir" value="C:\MyFolder" />
</appSettings>
在我的构建文件夹(Debug
或 Release
)中,如果我的项目名为 MyProject
.[=20=,文件将显示为 MyProject.exe.config
]
我想添加多个变量完全相同但值不同的相似配置文件,我想使用命令行参数指向配置文件,以便我可以重用相同的程序但设置不同.
如何告诉我的程序选择哪个配置文件?
通常的方法是根据构建配置应用转换文件。因此,您仍然只有一个配置文件,但根据构建的预期用途,它的构建方式有所不同。
像 SlowCheetah 这样的东西可以做到这一点,或者如果你使用像 octopus deploy 这样的东西来进行部署,那么它可以在部署时完成。
我会这样做:
<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;
}
}