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

Posted

技术标签:

【中文标题】如何从加载的 App.config 文件中检索 ApplicationSettings?【英文标题】:How do I retrieve ApplicationSettings from a loaded App.config file? 【发布时间】:2011-01-07 06:15:00 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

您可以找到更多信息from msdn

【讨论】:

【参考方案2】:

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

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

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

它将以下内容添加到应用程序的 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

注意,如果您已为 "User" 范围创建了 myOwnSetting,则它会存储在名为 &lt;userSettings&gt; 的部分中&lt;applicationSettings&gt;,但您仍然可以使用上面的代码行访问它。

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

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

如果您尝试对“应用程序”范围设置 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

在名为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是你指定的程序集信息的一部分,路径中也使用了程序集名称和版本。


注意:

&lt;sectionGroup&gt;&lt;section&gt; 声明是强制性的,其名称属性需要与命名空间匹配。命名空间在配置中必须只出现一次,并且只允许有一个applicationSettings 部分。

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

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

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

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

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

如果您不确定应该使用AppSettings 还是applicationSettings,请在决定之前read this

【讨论】:

几年过去了,我才再次阅读您的详细回答,并意识到我忘记了当时的赞成票。真丢脸——我道歉。【参考方案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 "";

【讨论】:

我整天都在寻找真正有效的解决方案。我没有将我的配置文件公开并从 WinForms 中的其他项目访问的奢侈。这是要走的路! :)

以上是关于如何从加载的 App.config 文件中检索 ApplicationSettings?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 App.config 中检索连接字符串 [重复]

无法从 App.Config 中检索密钥

错误的 app.config 加载

从 App.Config 将程序集加载到 AppDomain

从 app.config 加载配置(如果可用)

尝试检索不在 app.config 中的设置时返回的内容