回答

10

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

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

例如,如果你在你的项目中创建myOwnSetting WindowsFormsTestApplication1如下:

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,这将检索字符串“您好!”为变量currentValue

注意,如果您已经创建myOwnSetting“用户”范围,那么它存储在一个名为<userSettings>代替<applicationSettings>部分,但你仍然可以用上面的代码行访问它。

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

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

如果你尝试用“应用程序”范围设置myOwnSetting一样,它会导致编译时错误告诉你,它是只读的。

如果重新启动应用程序,你会发现,myUserSetting变为值“别的东西” - 但旧的值仍然是在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用户标识,FIRMNAME是您指定的程序集信息的一部分,程序集名称和版本也用于路径中。


注:

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

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

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

  • 如果你是而不是使用设置设计器,或者如果您使用的工具如LinqPad,您可能需要使用不同的方法。试想一下:

    ​​

    您可以通过将配置作为XDocument读字符串类型applicationSettings。给出的示例仅限于字符串类型,您可以从应用中检索设置。配置上面的例子如下:
    var value=GetApplicationSetting("myOwnSetting", "WindowsFormsTestApplication1.Properties.Settings");
    同样,你可以创建一个类似的功能GetUserSetting默认<userSettings>部分:只需复制上面的代码,重命名功能名称和userSettingsxPathStr更换applicationSettings

  • 没有可用于用户设置,其被描述here升级方法。关于位置的更多细节,其中存储用户设置可以发现there

  • 配置中的<appSettings>部分的工作方式不同,因为它没有区分“用户”和“应用程序”范围,它不支持不同的数据类型,只是字符串。然而,可以容易地读写配置键/值。 如果你有兴趣的代码,你可以在这里找到(#2):
    how to read/write config settings of appSettings

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

4

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

我认为这是首选使用的applicationSettings而非的appSettings,但应用程序设置是只读的在运行时,即你不能从你的代码中创建它们访问,但它可以创建并添加的appSettings我相信在运行时。 I asked a question about the difference

你可以找到更多信息from msdn

3
您可以加载配置文件到的XmlDocument和DOM对象retrive的的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 ""; 
} 
+0

我一直在寻找全天实际有效的解决方案。我没有让我的配置文件公众和WinForms的其他项目访问的奢侈品。这是要走的路! :) – 2015-09-03 21:24:58

相关问题