ロードされたapp.configファイルのapplicationSettings
セクションから値にアクセスすることは可能ですか?
How do I retrieve appSettingsの例を見つけましたが、この方法でアクセスする方法がわかりませんapplicationSettings
。
ロードされたapp.configファイルのapplicationSettings
セクションから値にアクセスすることは可能ですか?
How do I retrieve appSettingsの例を見つけましたが、この方法でアクセスする方法がわかりませんapplicationSettings
。
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.cs
C# コードを介してセッションにアクセスするために) という名前のファイルが作成されます。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
、決定する前にこれをお読みください。
どのように設定を作成しましたか?VS 設定デザイナーを使用していますか? もしそうなら、それらにアクセスするための強く型付けされたクラスを作成する必要があります。これは通常、次を使用してアクセスされます。Properties.Settings.Default.SettingName
appSettings よりも applicationSettings を使用する方が好ましいと思いますが、アプリケーション設定は実行時に読み取り専用です。つまり、コードから作成することはできませんが、実行時に appSettings を作成して追加することは可能だと思います。 違いについて質問しました
msdn から詳細情報を見つけることができます
//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 "";
}