14

ロードされたapp.configファイルのapplicationSettingsセクションから値にアクセスすることは可能ですか?

How do I retrieve appSettingsの例を見つけましたが、この方法でアクセスする方法がわかりませんapplicationSettings

4

3 に答える 3

14

applicationSettingsは実行時に読み取り専用です。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を作成した場合それはではなくという名前のセクションに格納されますが、上記のコード行で引き続きアクセスできます。<userSettings><applicationSettings>

スコープ「ユーザー」設定のもう 1 つの違いは、読み取り/書き込みアクセス権があることです。つまり、次の操作が許可されています。

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

「Application」スコープ設定 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 は指定したアセンブリ情報の一部であり、アセンブリ名とバージョンもパスで使用されていることがわかります。


ノート:

  • <sectionGroup>with宣言は必須であり、その<section>name 属性は名前空間と一致する必要があります。名前空間は構成内で 1 回だけ出現する必要があり、applicationSettings許可されるセクションは 1 つだけです。

  • 構成ファイルでわかるように、名前空間はそこに明示的に記載されています ( WindowsFormsTestApplication1.Properties.Settings)。結果として、同じ名前空間にないコードから設定にアクセスする場合は、完全修飾参照を使用する必要がある場合があります。<applicationSettings>...</applicationSettings>そうは言っても、あるアプリケーションの構成から別のアプリケーションの構成にセクション全体をコピーする場合は注意してください。後でターゲット構成の名前空間を変更する必要がある場合があります。

  • 設定デザイナー (プロジェクトの [設定] タブ) を使用している場合は、プロジェクトの [プロパティ] セクションにSettings.Settings( Settings.Designer.csC# コードを介してセッションにアクセスするために) という名前のファイルが作成されます。Web.configこれは、またはファイルにも保存されるため、設定のコピーですApp.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>を作成できます: 上記のコードをコピーし、関数名を変更してapplicationSettingsで置き換えxPathStrますuserSettings

  • ここで説明されているように、ユーザー設定に使用できるアップグレード方法があります。ユーザー設定が保存される場所の詳細については、そこを参照してください

  • 構成の<appSettings>セクションは、「ユーザー」と「アプリケーション」のスコープを区別せず、異なるデータ型をサポートせず、文字列のみをサポートするため、動作が異なります。ただし、構成キー/値を簡単に読み書きすることは可能です。コードに興味がある場合は、ここ (stackoverflow) で見つけることができます:
    how to read/write config settings of appSettings

  • AppSettingsと のどちらを使用するべきかわからない場合はapplicationSettings、決定する前にこれをお読みください。

于 2012-03-14T14:56:27.187 に答える
4

どのように設定を作成しましたか?VS 設定デザイナーを使用していますか? もしそうなら、それらにアクセスするための強く型付けされたクラスを作成する必要があります。これは通常、次を使用してアクセスされます。Properties.Settings.Default.SettingName

appSettings よりも applicationSettings を使用する方が好ましいと思いますが、アプリケーション設定は実行時に読み取り専用です。つまり、コードから作成することはできませんが、実行時に appSettings を作成して追加することは可能だと思います。 違いについて質問しました

msdn から詳細情報を見つけることができます

于 2010-01-20T12:34:09.990 に答える
3
構成ファイルを XmlDocument にロードし、dom オブジェクトから 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 "";
}
于 2012-08-16T15:45:20.333 に答える