Dot-Net

如何從載入的 App.config 文件中檢索 ApplicationSettings?

  • April 18, 2020

是否可以從載入的app.config文件的applicationSettings部分訪問值?

我找到了一個範例How do I retrieve appSettings,但我不知道如何以applicationSettings這種方式訪問。

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,請在決定之前**閱讀此內容。**

引用自:https://stackoverflow.com/questions/2101273