【问题标题】:AppSettings from custom files来自自定义文件的 AppSettings
【发布时间】:2013-06-27 07:03:01
【问题描述】:

我正在为 .NET 2.0 中的配置和设置类而苦苦挣扎

如果名为app.config的文件中包含以下内容

<config>
<appSettings>
<add key="Foo" value="Hello World!"/>
</appSettings>
</config>

我知道我可以通过

访问 appSetting
// this returns "Hello World!"
ConfigurationManager.AppSettings["Foo"]

但是,如果文件名为 app1.config(或任何其他名称),我将无法访问 appSetting。 只要我理解,ConfigurationManager.OpenExeConfiguration 我应该阅读自定义配置设置文件。

Configuration conf = ConfigurationManager.OpenExeConfiguration(@"..\..\app1.config");
// this prints an empty string.
Console.WriteLine(conf.AppSettings.Settings["Foo"]);

但是conf.AppSettings.Settings["Foo"] 返回一个空字符串。

我也试过下面的代码,但没有成功

ExeConfigurationFileMap exeFileMap = new ExeConfigurationFileMap();
exeFileMap.ExeConfigFilename = System.IO.Directory.GetCurrentDirectory()
                                                        + "\\App1.config";
Configuration myConf = ConfigurationManager.OpenMappedExeConfiguration
                                 (exeFileMap, ConfigurationUserLevel.None);
// returns empty string as well
Console.WriteLine(myConf.AppSettings.Settings["Foo"]);

如何从不名为 app.config 的文件中读取设置?

【问题讨论】:

  • ConfigurationManager.OpenExeConfiguration(@"..\..\app1.config"); 不起作用?
  • 重点是 conf.AppSettings.Settings["Foo"] 返回一个空字符串。我期待“Hello World!”
  • OpenExeConfiguration 获取可执行(exe)文件的路径作为参数,而不是设置文件的路径
  • 是的,我也尝试使用 ExeConfigurationFileMap 但仍然无法正常工作。
  • 嗨,伙计!我有相同的问题。你有什么办法让它发挥作用吗?

标签: c# configurationmanager appsettings


【解决方案1】:

我创建了自定义文件 myCustomConfiguration 并将其属性 Copy to Output Directory 更改为 true

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Foo" value="Hello World!"/>
  </appSettings>
</configuration>

在 CS 文件中

static void Main(string[] args)
{
    var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "myCustomConfiguration.config");
    Dictionary<string, string> dictionary = GetNameValueCollectionSection("appSettings", filePath);

    //To get your key do dictionary["Foo"]
            Console.WriteLine(dictionary["Foo"]);

    Console.ReadLine();
}

private static Dictionary<string, string> GetNameValueCollectionSection(string section, string filePath)
{
    var xDoc = new XmlDocument();
    var nameValueColl = new Dictionary<string, string>();

    var configFileMap = new ExeConfigurationFileMap { ExeConfigFilename = filePath };
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

    string xml = config.GetSection(section).SectionInformation.GetRawXml();
    xDoc.LoadXml(xml);
    XmlNode xList = xDoc.ChildNodes[0];
    foreach (XmlNode xNodo in xList.Cast<XmlNode>().Where(xNodo => xNodo.Attributes != null))
    {
        nameValueColl.Add(xNodo.Attributes[0].Value, xNodo.Attributes[1].Value);
    }

    return nameValueColl;
}

虽然这行得通,但我也在寻找更好的方法。

【讨论】:

    【解决方案2】:

    你应该使用设置文件,它使用起来更舒服,有保存和加载方法,你可以随意命名。例如。我的设置文件被称为“EditorSettings.settings”,我访问它的属性是这样的:

    MyNamespace.MyProject.EditorSettings.Default.MyProperty1
    

    【讨论】:

    • 我同意。另一方面,我想了解为什么 conf.AppSettings.Settings["Foo"] 不返回“Hello World!”
    • 您可能需要将值放在值子节点中:Hello World!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2022-08-22
    • 2016-09-23
    • 2016-02-27
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多