回答

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

相關問題