如何从加载的App.config文件中检索ApplicationSettings?

时间:2010-01-20 12:25:50

标签: .net visual-studio configuration app-config application-settings

是否可以从加载的app.config文件的 applicationSettings 部分访问这些值?

我找到了一个示例How do I retrieve appSettings,但我无法通过这种方式找到如何访问 applicationSettings

3 个答案:

答案 0 :(得分:12)

applicationSettings 在运行时只读。您可以直接通过app.config文件中的文本编辑器设置/修改它们,但建议在Visual Studio中打开项目属性并选择"设置"标签。设置正确的范围非常重要:

  • 如果设置适用于整个应用程序(适用于所有用户),请选择"应用程序"作为范围。
  • 如果每个用户都有个别设置(绑定到用户个人资料),请选择"用户"

例如,如果您在项目 WindowsFormsTestApplication1 中创建 myOwnSetting ,如下所示:

myOwnSetting

它会将以下内容添加到应用程序的app.config文件中:

<configuration>
    <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <section name="WindowsFormsTestApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsFormsTestApplication1.Properties.Settings>
            <setting name="myOwnSetting" serializeAs="String">
                <value>Hi there!</value>
            </setting>
        </WindowsFormsTestApplication1.Properties.Settings>
    </applicationSettings>
</configuration>

Visual Studio创建C#代码以自动访问此设置(这就是您应该在项目属性中而不是通过文本编辑器执行此操作的原因) - 保存更改后,从同一命名空间中可以读取其中的值该应用程序可以通过以下代码轻松实现:

var currentValue = Properties.Settings.Default.myOwnSetting;

鉴于上面列表中的applicationSettings,这将检索字符串&#34;嗨那里!&#34;对于变量currentValue

注意如果您为&#34;用户&#34;创建了 myOwnSetting 范围,然后它存储在名为<userSettings>而不是<applicationSettings>的部分中,但您仍然可以使用上面的代码行访问它。

范围&#34;用户&#34; 设置的另一个区别是您具有读写访问权限,即允许执行以下操作:

        Properties.Settings.Default.myUserSetting = "Something else";
        Properties.Settings.Default.Save();

如果您尝试使用&#34;应用程序&#34;范围设置myOwnSetting,它会导致编译时错误,告诉你它是只读的。

如果您重新启动该应用程序,您会注意到myUserSetting已更改为值&#34;其他内容&#34; - 但旧值仍在app.config中。为什么会这样?原因是它被视为默认值 - 正如我之前所说,&#34;用户&#34; scope绑定到用户配置文件。因此,价值&#34;其他&#34;存储在

C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0

在名为User.config的文件中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <WindowsFormsTestApplication1.Properties.Settings>
            <setting name="myUserSetting" serializeAs="String">
                <value>Something else</value>
            </setting>
        </WindowsFormsTestApplication1.Properties.Settings>
    </userSettings>
</configuration>

您无法准确地告知.NET Framework自动创建的路径,并且它在您的PC上看起来会有所不同。但是您可以看到USERID是当前用户的Windows用户ID,FIRMNAME是您指定的程序集信息的一部分,程序集名称和版本也在路径中使用。


注意:

  • 带有<sectionGroup>声明的<section>是必需的,其name属性需要与命名空间匹配。命名空间必须在配置中只显示一次,并且只允许一个applicationSettings部分。

  • 正如您在配置文件中看到的那样,明确提到了命名空间(WindowsFormsTestApplication1.Properties.Settings)。因此,如果要从不在同一名称空间中的代码访问设置,则可能需要使用完全限定的引用。话虽如此,如果将整个<applicationSettings>...</applicationSettings>部分从一个应用程序的配置复制到另一个应用程序的配置,请小心 - 您可能需要在之后更改目标配置中的命名空间。

  • 如果您正在使用设置设计器(项目中的“设置”标签),则会创建名为 Settings.Settings 的文件(以及Settings.Designer.cs在项目的Properties部分中通过C#代码访问sessings。这是设置的副本,因为它也将存储在Web.configApp.config文件中(取决于您的项目类型,仅适用于应用程序范围设置 - 用户范围设置根据用户存储轮廓)。您可以创建其他*.settings个文件并使用它们(如here所述)。

  • 如果您使用设置设计器,或者您使用LinqPad之类的工具,则可能需要使用其他方法。考虑一下:

    internal static string GetApplicationSetting(string key, 
            string nameSpace="Properties.Settings")
    {
        string xValue=null;
        try 
        {
            string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            XDocument doc = XDocument.Load(path);
            var xPathStr= string.IsNullOrEmpty(nameSpace) 
                            ? "//applicationSettings" 
                            : $"//applicationSettings/{nameSpace}";
            var settings=doc.XPathSelectElement(xPathStr).Elements().Where(
                                w => w.Name=="setting" 
                                    && w.HasAttributes 
                                    && w.Attribute("serializeAs").Value=="String"
                                );
            var setting=settings.Where(f => f.HasAttributes 
                                            && f.Attribute("name").Value==key).Elements();
            xValue=setting.FirstOrDefault().Value;
        }
        catch {}
        return xValue;
    }
    

    您可以通过将配置视为applicationSettings来读取字符串类型XDocument。给出的示例仅限于字符串类型,您可以从上面的app.config示例中检索设置,如下所示:
    var value=GetApplicationSetting("myOwnSetting", "WindowsFormsTestApplication1.Properties.Settings");
    同样,您可以为默认的<userSettings>部分创建类似的功能 GetUserSetting :只需复制上面的代码,重命名函数名称并替换applicationSettings中的xPathStr userSettings

  • 有一种可用于用户设置的升级方法,其描述为here。有关存储用户设置的位置的更多详细信息,请参见there

  • 配置中的 <appSettings> 部分的工作方式不同,因为它不区分&#34;用户&#34;和#34;应用程序&#34;范围,它不支持不同的数据类型,只支持字符串。但是,可以轻松地读取和写入配置键/值。 如果您对代码感兴趣,可以在此处找到它(在stackoverflow上):
    how to read/write config settings of appSettings

  • 如果您不确定是否应该使用AppSettingsapplicationSettings,然后在决定之前使用 read this

答案 1 :(得分:4)

您是如何创建设置的?使用VS设置设计器?如果是这样,它应该创建一个强类型类来访问它们。通常使用Properties.Settings.Default.SettingName

访问

我认为最好使用applicationSettings而不是appSettings,但是应用程序设置在运行时是只读的,即你不能从代码中创建它们,但是我可以在运行时创建和添加appSettings。 I asked a question about the difference

您可以找到更多信息from msdn

答案 2 :(得分:3)

您可以将配置文件加载到XmlDocument中并检索applicationSettings     来自dom对象。     这是我发现将配置文件加载到dom对象的示例:

//retrive the current assembly directory
private static string AssemblyDirectory()
{
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
}



//return the value from aplicationSetting according to the given key
//appSettingSection is the your configuration section as declare in your web.config
public static string GetApplicationSettingValue(string appSettingSection,string key)
{
   //get web.config path
   string configPath  = new System.IO.DirectoryInfo(AssemblyDirectory()).Parent.FullName + "\\web.config";

    System.IO.FileInfo FileInfo = new System.IO.FileInfo(configPath);
    if (!FileInfo.Exists)
    {
        throw new Exception("Missing config file");
    }

    //load config file into xml document
    var XmlConfig = new System.Xml.XmlDocument();
    XmlConfig.Load(FileInfo.FullName);


     //override xml document and return the value of the key under applicationSettings
     foreach (System.Xml.XmlNode node in XmlConfig["configuration"]  ["applicationSettings"]appSettingSection])
     {
                    if (node.Name == "setting")
                    {
                        if (node.Attributes.GetNamedItem("name").Value == key)
                        {
                            return node.FirstChild.InnerXml.ToString();
                        }
                   }
     }
   return "";
}