14

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

我找到了一个示例How do I retrieve appSettings,但我不知道如何以applicationSettings这种方式访问​​。

4

3 回答 3

14

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

  • 如果设置适用于整个应用程序(适用于所有用户),请选择“应用程序”作为范围。
  • 如果每个用户都应该有单独的设置(绑定到用户配置文件),那么选择“用户”

例如,如果您按如下方式在项目WindowsFormsTestApplication1中创建myOwnSetting(将范围更改为"Application"):

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上面的清单,这将检索字符串“Hi there!” 为变量currentValue

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

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

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

如果您尝试对“应用程序”范围设置 myOwnSetting 进行相同操作,则会导致编译时错误,告诉您它是只读的。

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

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>with声明是强制性的<section>,它的 name 属性需要与命名空间匹配。命名空间在配置中必须只出现一次,并且只applicationSettings允许出现一个部分。

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

  • 如果您使用设置设计器(项目中的“设置”选项卡),它将在项目的“属性”部分创建一个名为Settings.Settings(以及Settings.Designer.cs通过 C# 代码访问 sessings)的文件。这是设置的副本,因为它也将存储在您的Web.configorApp.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;
    }
    

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

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

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

  • 如果您不确定是否应该使用AppSettingsor applicationSettings,请在决定之前阅读此内容。

于 2012-03-14T14:56:27.187 回答
4

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

我认为最好使用 applicationSettings 而不是 appSettings,但应用程序设置在运行时是只读的,即您不能从代码中创建它们,但我相信可以在运行时创建和添加 appSettings。 我问了一个关于区别的问题

您可以从 msdn找到更多信息

于 2010-01-20T12:34:09.990 回答
3
您可以将配置文件加载到 XmlDocument 并从 dom 对象中检索 applicationSettings 。这是我发现将配置文件加载到 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 "";
}
于 2012-08-16T15:45:20.333 回答