2010-09-03 49 views
13

我正在尋找一種方法來存儲應用程序或機器級別設置,可以使用Application Settings在運行時寫入。用戶設置允許讀/寫,但應用程序設置不允許。我一直在使用用戶設置在運行時保存此類設置,但由於以下原因,這已被證明是不切實際的:如何在不使用用戶設置的情況下在運行時讀取/寫入app.config設置?

  • 本機的所有用戶都需要共享設置。
  • 在支持呼叫中(特別是在危機情況下),很難向用戶/員工解釋在哪裏手動查找和修改這些設置(appdata是隱藏文件夾等)。
  • 新版本的應用程序需要使用以前的設置(用戶設置似乎被新版本吹走)。
  • 我們的員工通常會將應用程序複製到一個新文件夾,該文件夾也會重置用戶設置。

我們公司的機器只能由一個用戶使用,因此通常不需要用戶特定的設置。

否則,我真的很喜歡使用應用程序設置,並希望在可能的情況下繼續使用它們。如果設置可能位於與EXE相同的文件夾(如曾用過的良好的ini文件),那將是理想的選擇。

注意:這是一個WPF應用程序,而不是一個ASP.net的Web應用程序,所以沒有web.config。

+0

在同一個目錄中存儲寫入設置爲EXE是一個壞主意 - 在Vista/Win7的,這需要管理員寫入和意志觸發UAC並導致您的應用程序運行提升。最好在別處存儲應用程序設置。 – Andy 2010-09-05 03:36:55

+0

@Andy這對我來說不太合適。我編寫了很多程序,可以在與EXE相同的目錄下寫入xml文件,而不會觸發UAC。 – 2010-09-05 22:50:42

回答

9

那麼,我還沒有想要在運行時更改應用程序設置(這就是我使用的用戶設置),但我所能做的是在安裝時編寫應用程序設置。我想像一種類似的方法可能在運行時工作。你可以嘗試一下,因爲似乎沒有任何其他的解決方案ATM。

exePath = Path.Combine(exePath, "MyApp.exe"); 
    Configuration config = ConfigurationManager.OpenExeConfiguration(exePath); 
    var setting = config.AppSettings.Settings[SettingKey]; 
    if (setting != null) 
    { 
     setting.Value = newValue; 
    } 
    else 
    { 
     config.AppSettings.Settings.Add(SettingKey, newValue); 
    } 

    config.Save(); 

希望幫助!

3

WPF應用程序能夠訪問app.config文件就像WinForms的應用程式通過

ConfigurationManager.OpenExeConfiguration() 

方法。訣竅是在你的App.config文件的AppSettings標籤中存取你想訪問的值(也可在WPF應用程序中使用)。

訣竅所有這一切都是爲了確保調用下面的方法,當你完成修改您的屬性:

MyConfig.Save(ConfigurationSaveMode.Modified) 
ConfigurationManager.RefreshSection("appSettings") 

我寫了一個完整的「如何」這個一會兒回來說全部解釋爲here

+0

如果用戶沒有正確的UAC權限,則這不起作用。 – JWiley 2015-04-17 17:27:00

+0

@JWiley好點。我想另一個假設是應用程序安裝在可以修改此文件的位置。 – 2015-04-17 19:03:21

6

這是一個允許你改變在<AppSettings>項的方法:

internal static bool SetSetting(string Key, string Value) 
    { 
     bool result = false; 
     try 
     { 
      System.Configuration.Configuration config = 
       ConfigurationManager.OpenExeConfiguration(
            ConfigurationUserLevel.None); 

      config.AppSettings.Settings.Remove(Key); 
      var kvElem= new KeyValueConfigurationElement(Key, Value); 
      config.AppSettings.Settings.Add(kvElem); 

      // Save the configuration file. 
      config.Save(ConfigurationSaveMode.Modified); 

      // Force a reload of a changed section. 
      ConfigurationManager.RefreshSection("appSettings");     

      result = true; 
     } 
     finally 
     { } 
     return result; 
    } // function 

注意,我發現有必要刷新更新後的部分appSettings

該函數在添加密鑰之前刪除密鑰,以避免重複輸入。如果密鑰以前不存在,這也適用。如果有任何錯誤,則返回,成功true。閱讀設置的方法是微不足道的,只是上市的完整性:

internal static string GetSetting(string Key) 
    { 
     string result = null; 
     try 
     { 
      result = ConfigurationManager.AppSettings[Key]; 
     } 
     finally 
     { } 
     return result; 
    } // function 

注意,我已經被周圍它嘗試......終於塊壓制錯誤。如果發生任何錯誤,則GetSetting僅返回null,而SetSetting返回false。這使得處理更容易,但是如果您需要例外,您仍然可以添加

 catch (Exception) { throw; } 

將異常向調用方拋出。或者,調試您可以添加:

 #if DEBUG 
     catch (Exception ex) { 
       System.Diagnostics.Debug.WriteLine(ex.ToString()); 
     } 
     #endif 

,它會顯示在Visual Studio的輸出窗口中的異常,如果你選擇了「調試」配置,但將繼續與代碼。


注(交叉引用到一個類似的主題):

  • 的applicationSettings部分是不同的,因爲它區分「用戶」和「應用程序」範圍之間,它支持不同的數據類型,不只是字符串。如果你想知道你如何處理的applicationSettings,你可以在這裏找到(#2):
    How to access applicationSettings

  • 如果你不確定你是否應該使用AppSettingsapplicationSettings,然後read this,然後再決定它。

  • 如果遇到警告'ConfigurationSettings.AppSettings' is obsolete,然後this hint can help you.