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

al-*_*bex 11 .net configuration app-config application-settings visual-studio

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

我找到了一个示例如何检索appSettings,但我无法通过这种方式找到如何访问applicationSettings.

Mat*_*att 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>
Run Code Online (Sandbox Code Playgroud)

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

var currentValue = Properties.Settings.Default.myOwnSetting;
Run Code Online (Sandbox Code Playgroud)

鉴于applicationSettings上面的列表,这将检索字符串"嗨那里!" 对于变量currentValue.

请注意,如果您为"用户"范围创建了myOwnSetting,那么它将存储在名为而不是的部分中,但您仍然可以使用上面的代码行访问它.<userSettings><applicationSettings>

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

        Properties.Settings.Default.myUserSetting = "Something else";
        Properties.Settings.Default.Save();
Run Code Online (Sandbox Code Playgroud)

如果您对"应用程序"范围设置myOwnSetting尝试相同,则会导致编译时错误,告知您它是只读的.

如果重新启动应用程序,您会注意到myUserSetting已更改为值"Something else" - 但旧值仍在app.config中.为什么会这样?原因是它被视为默认值 - 正如我之前所说,"用户"范围与用户配置文件绑定.结果,存储了"Something else"值

C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0
Run Code Online (Sandbox Code Playgroud)

在一个名为的文件中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>
Run Code Online (Sandbox Code Playgroud)

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


注意:

  • <sectionGroup><section>声明是强制性的,它的名字属性需要匹配的命名空间.命名空间必须在配置中只出现一次,并且只applicationSettings允许一个部分.

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

  • 如果您正在使用Settings Designer(项目中的Settings选项卡),它将在项目的Properties部分中创建一个名为Settings.Settings(以及Settings.Designer.cs通过C#代码访问sessings)的文件.这是设置的副本,因为它会被存储在您的Web.configApp.config文件,以及(根据项目类型,只针对应用范围的设置-用户范围设置都是基于用户配置文件存储).您可以创建其他*.settings文件,并使用它们(因为它是描述在这里).

  • 如果您没有使用设置设计器,或者您使用的是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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 有一种可用于用户设置的升级方法,此处对此进行了描述.可以在那里找到有关存储用户设置的位置的更多详细信息.

  • <appSettings>配置中的部分工作方式不同,因为它不区分"用户"和"应用程序"范围,并且它不支持不同的数据类型,只支持字符串.但是,可以轻松读取和写入配置键/值.如果您对代码感兴趣,可以在这里找到它(在stackoverflow上):
    如何读取/写入appSettings的配置设置

  • 如果您不确定是否应该使用AppSettingsapplicationSettings,在决定之前阅读此内容.


归档时间:

查看次数:

20447 次

最近记录:

7 年,7 月 前