c#App.config,ConfigurationManager の読み込みと書き込み。
アプリケーションには、バージョン番号やデータベースへの接続文字列など、何らかの設定情報を書きたいことがよくあります。WinFormアプリケーションでProperties.Settingsを使って同様のことができることはご存知かと思いますが、実際にはApp.configという設定ファイルを利用します。
この記事では、コード内でApp.configにアクセスする方法を探ります。App.configの使用方法は、上記の使用方法よりもはるかに複雑なので、最も基本的なappSettingsの設定部分のみを説明します。
I. 設定ファイルの概要
アプリケーション設定ファイルは、大文字と小文字が区別されるXMLタグと属性を持つ標準的なXMLファイルです。これはオンデマンドで変更可能であり、開発者はアプリケーションを再コンパイルすることなく、設定ファイルを使用して設定を変更することができます。設定ファイルのルートノードはconfigurationです。私たちはしばしばappSettingsにアクセスしますが、これは.NETによる事前定義された設定セクションです。私たちがよく使う設定ファイルのアーキテクチャは、以下のゲストポストのような形になっています。まずはその印象を掴み、その後に続く例でそのイメージを掴みます。以下の "configuration section" は、XMLを設定するためのノードとして理解することができます。
一般的な設定ファイルのスキーマ
構成セクションと名前空間宣言を含む //Configuration section declaration area (構成セクション宣言領域)
//コンフィギュレーションセクション宣言
//コンフィギュレーションセクションのグループを定義する
//構成セクショングループ内の構成セクション宣言
// 定義済みコンフィギュレーションセクション
//コンフィギュレーションセクション設定エリア
以下は、最も一般的なアプリケーション設定ファイルの1つで、appSettingsセクションのみを記述した例です。
定義済みのappSettingsセクション(大文字と小文字が区別されます)には、"add"という名前の要素と、"key"と"value"という二つの属性がいくつか存在します。
.NETはappSettingsセクションにアクセスする方法を提供します。.NET 1.0 と 1.1 では、System.Configuration.ConfigurationSettings.AppSettings["Key"]を使用して、キー = "Key" の要素の value 属性にアクセスすることが可能です。
注)このConfigurationSettingsプロパティは、.Net FrameWork 2.0では明示的に非推奨となり、ConfigurationManagerまたはWebConfigurationManagerに変更することが推奨されています。
ConfigurationManager を使用するには、プロジェクトに system.configuration.dll アセンブリへの参照を追加する必要があります。(ソリューション・マネージャでプロジェクト名を右クリックし、コンテキスト・メニューの[参照の追加]を選択し、.NETタブの下で見つけます)。
参照を追加した後、ConfigurationManager.AppSettings["Key"]を使用して、対応する値を読み取ることができます。
ただし、ConfigurationManager.AppSettingsのプロパティは読み取り専用で、プロパティ値の変更には対応していません。これは、Microsoftがapp.configファイルに動的に書き込むことを推奨しておらず、手動で設定し、アプリケーションの実行時にのみ静的にアクセスすることを想定しているためです。
どうしてもアプリケーションに変更を加える、つまりApp.Configに書き込む必要がある場合は、下を向いてください。
II. appSettings設定セクションの読み取りと書き込み操作
App.config ファイルの appSettings セクションを読み込む方法は比較的簡単で、System.Configuration.File を使ってアクセスすることができます。ConfigurationManager["Key"]でアクセスできますが、すでに述べたように、そのメソッドは書き込みを提供しません。
設定ファイルに書き込む場合は、ConfigurationManagerオブジェクトを使って設定ファイルを開く操作を行うと、Configurationオブジェクトが返ってくるので、それを使って操作(追加、削除、変更、チェック)を行うことができます。
以下のコードで実装します(using System.Configuration名前空間への参照を追加しています)。
private void AccessAppSettings()
{
//Get the Configuration object
Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// Read the Value of the element according to the Key
string name = config.AppSettings.Settings["name"].Value;
//write the Value of the element
settings["name"].Value = "xieyc";
//add elements
config.AppSettings.Settings.Add("url", "http://www.myhack58.com");
//delete elements
config.AppSettings.Settings.Remove("name");
//be sure to remember to save, write config.Save() without parameters as well
Save(ConfigurationSaveMode.Modified);
//refresh, otherwise the program reads the previous value (which may have been loaded into memory)
System.Configuration.ConfigurationManager.RefreshSection("appSettings");
}
一つ注意すべきは
1. 存在しない Key 値に基づいて要素にアクセスしたり、存在しない要素を remove() メソッドで削除したりしても、例外は発生せず、前者は null を返します。
2. 2. 既に存在する要素を追加する場合も例外は発生しませんが、既存の Value と新しい Value を "," で区切って連結します (例: "olldvalue,newvalue").
3. プロジェクトがコンパイルされると、実行ディレクトリのbinDebugeファイルに2つの設定ファイルが現れます。1つは"ProjectName.EXE.config"、もう1つは"ProjectName.vshost. exe.config"という名称のファイルです。最初のファイルは、プロジェクトで使用される実際の設定ファイルで、プログラム実行中に変更されるとそこに保存されます。2番目のファイルは、実際にはオリジナルコードの "App.config" の同期ファイルで、プログラム実行中に変更されることはありません。
4. 4. appSettings 設定セクションなど、大文字と小文字に特に注意してください(XML ファイルは大文字と小文字が区別されます)。
5. 5. 読者の中には、app.configは標準的なXMLだから、一般のXMLファイルを操作するのと同じように、確かに読み書きができると思われる方もいらっしゃるかもしれません。これは確かに可能です! ただし、app.configファイルを提供するのはVSの目的を逸脱していると思うので、自分で設定ファイルを定義したほうが便利だと思います。
この記事では、app.configファイルのappSettingsセクションにアクセスする方法をざっくりと説明します。connectionStringsセクションも基本的には同様で、このセクションをカスタマイズすることも可能です。例えば、WinFormアプリケーションの設定(IDEまたはコードからアクセス可能)は、実際にapp.configファイルを使用しています。
関連
-
C# indexof() の使用法
-
C#高精度遅延コード実行時間(us/ns)
-
VS エラー LNK2005:**already defined in **.obj
-
インデックスが配列の範囲外であった。
-
エラーです。名前 'Encoding' は現在のコンテキストに存在しない ソリューション
-
MessageBoxメソッドを使用したASP.NET
-
InvalidOperationExceptionが発生しました。「コレクションが変更されました。列挙操作の可能性があります。
-
ファイルまたはアセンブリ "Oracle "の読み込みに失敗しました。
-
Winformを使用しているとき、"string "型を "System.Form "型に暗黙的に変換できないというエラーが発生します。
-
GetProperty リフレクションの代入 SetValue エラーです。System.Byte "型のオブジェクトは "System.Nullable`1[System.Int32]"型に変換することができません。Int32]」に変換できません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C#の遅延関数の使用
-
C#とC++の型対応表まとめ
-
C#のビルドコードで、すべてのコードパスが値を返さないエラーが発生する
-
System.InvalidOperationException: ConnectionString プロパティが初期化されていません。
-
C#のExcelエクスポートでHRESULT:0x800A03ECが発生する例外を解決する方法
-
ASP.NET URL変更によるページ受け渡し
-
AppDomainとAssemblyの動的なロードとアンロード
-
CS0120 非静的フィールド、メソッド、またはプロパティにオブジェクト参照が必要です XX
-
HeaderCellに行番号を表示するC# DataGridViewメソッド
-
System.DllNotFoundException 問題分析と解決策