应用程序之间的常见app.config

时间:2012-03-15 13:09:15

标签: c#

我需要一个由三个应用程序共享的公共配置文件

我通过添加appSettings

中的文件解决了这个问题
<appSettings file="ait.config">
    <!--<add key="Culture" value="zh-CN" />-->
    <add key="Culture" value=""/>
    <add key="ClientSettingsProvider.ServiceUri" value=""/>
</appSettings>

在ait.config中,我存储了一些常见的值,如

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
    <add key="Username" value="Klabberius" />
</appSettings>

如果我试着像

那样阅读
 string stvalue = ConfigurationManager.AppSettings["Username"];

它工作正常,但如果我尝试写一个像

这样的值
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

config.AppSettings.Settings["Username"].Value = userName;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

不是写入公共文件ait.config,而是将密钥用户名添加到每个单独应用程序中的标准app.config,任何人都知道如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

使用您的方法,您可以更改当前配置,而不是所需的文件,因为这是您打开的文档。不幸的是,共享配置似乎不被“接受”为配置文件,因为它缺少配置节点。您可以从config(在代码行1之后)打开共享配置作为“普通”xml文档:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(config.AppSettings.File);

然后你应该改变文档。对我感到羞耻我对linq到xml不太好,下面的工作方式,但可能有一个更简单的方法。

XmlNode n = xmlDoc.SelectSingleNode("//appSettings");
XmlNode x = n.ChildNodes[0];
x.Attributes[1].Value = userName;
xmlDoc.Save(config.AppSettings.File);

答案 1 :(得分:0)

我相信应用设置文件路径默认为app.config。可能会让人耳目没有测试过这个,但是请尝试这个 - 在初始化配置之后和调用save之前添加这行代码

config.AppSettings.File = config.FilePath;

HTH

答案 2 :(得分:0)

将设置划分为单独文件的标准方法是使用ConfigSource of ConfigurationSection。因此,如果您想在“ait.config”中保留AppSettings的 ALL ,您可以这样做:

<appSettings configSource="ait.config" />

但是,请注意,仅当您将 ALL 的AppSettings保留在单独的文件中时,此方法才有效。如果您尝试在主应用配置文件中保留一些设置,例如:

<appSettings configSource="ait.config">
  <add key="Culture" value=""/>
  <add key="ClientSettingsProvider.ServiceUri" value=""/>
</appSettings>

您会收到一个例外情况,例如“部分只能在每个配置文件中显示一次。”。

您应该为共享配置使用“自定义配置部分”,请尝试:

  1. Create Custom Configuration Sections Using ConfigurationSection 即可。
  2. 自定义配置栏 ConfigSource 指向包含常用配置的文件。
  3. 这是一个简单的入门示例:

    定义自定义栏目

    public class CommonConfSection : ConfigurationSection
    {
        private const String UserNameProperty = "Username";
        [ConfigurationProperty(UserNameProperty, DefaultValue = "__UNKNOWN_NAME__", IsRequired = false)]
        public String UserName
        {
            get { return (String)this[UserNameProperty]; }
            set { this[UserNameProperty] = value; }
        }
    }
    

    <强> App.config中:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="CommonSettings"
             type="[Your Assembly Name].CommonConfSection, [Your Assembly Name]"
             />
      </configSections>
    
      <appSettings>
        <add key="Culture" value=""/>
        <add key="ClientSettingsProvider.ServiceUri" value=""/>
      </appSettings>
    
      <CommonSettings configSource="common.config" />
    </configuration>
    

    注意:

    1. configSections 必须是配置的第一个子节点;
    2. CommonSettings 部分: configSource =“common.config”表示此部分的设置存储在名为“ common.config “(在同一个文件夹中)。
    3. 以下是 common.config 的样子:

      <?xml version="1.0" encoding="utf-8" ?>
      <CommonSettings Username="testUser" />