.NET TIPS アプリケーション設定を活用するには?[2.0のみ、C#、VB]デジタルアドバンテージ 一色 政彦2007/02/22 |
|
|
Windowsアプリケーション(やコンソール・アプリケーション)自体の設定に関する情報(以降、アプリケーション設定)は、.NETでは通常、アプリケーション構成ファイル(「<プログラム名>.exe.config」という名前のXMLファイル)で管理する。この仕組みを利用して、プログラムで扱う設定情報をハード・コーディングせずに外部データで管理しておけば、プログラムをビルドした後からでも(その外部データであるXMLファイルを書き換えるだけで)容易にプログラムの挙動を変更できる。
このプログラム自体の(固定的な)設定情報を外部データ化する手法は、1つのプログラムの挙動を利用環境や利用ケースに合わせて変化させたいときなどで役立つ。例えばあるプログラムにデモ版と製品版の2つのエディションがあり、それぞれのエディションごとにWindowsフォーム上のタイトル文字列を切り替えたいような場合、(プログラム自体はそのままで)内容が異なる2つのアプリケーション構成ファイルを用意しておき、それを適切に取り換えるだけで対応できるというわけだ。
またこれは、に設定情報を入力しプログラム内部で取り扱う(可変的な)設定情報を外部データ化する際にも便利だ。この設定情報とは、従来はレジストリや.INIファイルに保存して読み書きしていたデータ(例えばウィンドウの位置やサイズ、「最近使ったファイル」などの履歴情報など)である(関連:「TIPS:アプリケーション設定情報はどこに保存すべきか?」)。
.NET Framework 2.0では、これらのアプリケーション設定の取り扱いが、以前と比べて格段に容易になっている。
そこで本稿では、.NET Framework 2.0でのアプリケーション設定の(基本的な)取り扱い方法について紹介する。C#とVisual Basic(以降、VB)で取り扱い方法が違う部分は、その違いについても言及する。
なお、本稿のTIPSの内容が実践的に活用された例として、「TIPS:Windowsアプリケーションの位置やサイズを保存するには?」もあるので、併せて参照していただきたい。
アプリケーション設定の格納方法
アプリケーション設定を格納するための最も基本的な方法は、Visual Studio 2005(以降、VS 2005)のIDEを使うものだ。
これにはまず、任意のプロジェクトのプロジェクト・プロパティで[設定]タブを開き、そこに設定情報を入力していく。入力の具体的な手順は次の画面を参考にしてほしい。
VS 2005でのアプリケーション設定の入力 | |||||||||||||||
プロジェクト・プロパティからアプリケーション設定を入力しているところ。プロジェクト・プロパティは、ソリューション・エクスプローラでプロジェクト項目を右クリックし、そこで表示されるコンテキスト・メニューから[プロパティ]を選択すると表示される。なお、このような画面が表示されずに「このプロジェクトには既定の設定ファイルが含まれて居ません。ファイルを作成するには、ここをクリックしてください。」というリンク・ラベルが表示されている場合は、それをクリックすることでこの画面が表示される。 | |||||||||||||||
|
ここで設定した内容は、(基本的に)プロジェクト配下のプロジェクト・プロパティ用のフォルダ(C#では「Properties」、VBでは「My Project」)内に生成される「Settings.settings」ファイルに格納される(※.settingsファイルは、VS 2005で導入された機能で、アプリケーション設定を管理するためのものである)。そしてこの状態でプロジェクトをビルドすると、そのアプリケーション設定がアプリケーション構成ファイル(厳密には「app.config」ファイル)に格納され、アプリケーション設定を取り扱うためのクラスがアセンブリ(=.EXEファイルや.DLLファイル)に自動的に組み込まれる。なおapp.configファイルは、ビルドすると自動的に出力ディレクトリに「<プログラム名>.exe.config」という名前でコピーされて、アプリケーション構成ファイルとして使われる。
スコープについては注意が必要となるため、以下で少し詳しく説明しておこう。
スコープ:アプリケーション設定とユーザー設定
スコープとは、アプリケーション設定が用いられる範囲を示すためのものだ。スコープは次のいずれかから選択できる。
- アプリケーション・スコープ (=アプリケーション単位)
- ユーザー・スコープ (=ユーザー単位)
(冒頭で紹介したような)プログラムの挙動を定義する(固定的な)設定情報には、基本的にアプリケーション・スコープを指定する。この仕様から、アプリケーション・スコープを指定したアプリケーション設定(以降、アプリケーション・スコープ設定)を操作するプロパティは読み取り専用となり、プログラム内から動的に設定情報を上書きすることはできない。
一方、主にユーザーごとのアプリケーションの状態(例えばウィンドウのサイズや位置など)を定める(可変的な)設定情報には、ユーザー・スコープを指定する。この仕様に基づき、ユーザー・スコープを指定したアプリケーション設定(以降、ユーザー・スコープ設定)を操作するプロパティはGet(取得)だけでなくSet(設定)も可能となっており、プログラム内から動的に設定情報を読み書きできる。
この2種類のアプリケーション設定は、VS 2005上で入力・保存した段階では、いずれもアプリケーション構成ファイル(=app.configファイル → <プログラム名>.exe.config)内で管理される。その配置場所は次のとおりである(※下記のコードにあるConfigurationManagerクラスとConfigurationUserLevel列挙体は、System.Configuration名前空間に属する。コードの実行には、System.Configuration.dllへの参照が必要である)。
【アプリケーション構成ファイル(.exe.config)】の配置場所 | ||
→ 実行可能ファイル(.exeファイル)と同じフォルダ内 | ||
→ Windows XP環境でのファイル・パスの例: | ||
C:\fdotnet\ConsoleApplication1\ConsoleApplication1.exe.config |
||
→ 構成ファイルのパスを取得するコード(1): | ||
ConfigurationManager.OpenExeConfiguration( |
||
→ 構成ファイルのパスを取得するコード(2): | ||
System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile |
前述のとおり、ユーザー・スコープ設定では設定情報をプログラムから変更できるが、実際に変更すると、アプリケーション構成ファイル(<プログラム名>.exe.config)の内容は書き換えられずに、ユーザー構成ファイル(user.config)の内容が変更される。ユーザー構成ファイルとは、ユーザーごとに作成される構成ファイルである。
ユーザー構成ファイル(user.config)の基本的な仕様では、通常のローカル・ユーザーごとのファイルと、(めったに使われないが……)ローミング・ユーザーごとのファイルの2種類があり、それぞれ格納場所が異なる。ローミング・ユーザー(=別名「移動ユーザー」)とは「ネットワーク上のどのコンピュータにログオンしても同じデスクトップ環境を実現できる」というWindows OSの機能である(ローミング・ユーザーの設定方法については、TechNetの「移動ユーザー プロファイルを作成する」を参照されたい)。
それぞれのユーザー構成ファイルの配置場所は次のとおりだ。
【ローカル・ユーザーに対するユーザー構成ファイル(user.config)】の配置場所 | ||
→ ローカル・ユーザーごとのアプリケーション・データ・フォルダの配下 | ||
→ Windows XP環境でのファイル・パスの例: | ||
C:\Documents and Settings\masa-i.D-ADVANTAGE\Local Settings\ |
||
→ 構成ファイルのパスを取得するコード: | ||
ConfigurationManager.OpenExeConfiguration( |
【ローミング・ユーザーに対するユーザー構成ファイル(user.config)】の配置場所 | ||
→ ローミング・ユーザーごとのアプリケーション・データ・フォルダの配下 | ||
→ Windows XP環境でのファイル・パスの例: | ||
C:\Documents and Settings\masa-i.D-ADVANTAGE\Application Data\ |
||
→ 構成ファイルのパスを取得するコード: | ||
ConfigurationManager.OpenExeConfiguration( |
.NET Framework 2.0の基本的な方針からいえば、ローミング・ユーザーでアプリケーションを実行している場合、当然ながらローミング・ユーザーに対するユーザー構成ファイル(user.config)を使う必要がある。しかし、VS 2005の(ユーザー・スコープを指定した)アプリケーション設定の機能では、
ローミング・ユーザーであったとしても、ローカル・ユーザー(=非ローミング・ユーザー)に対するユーザー構成ファイル(user.config)が使われる
という仕様になっているようである。
アプリケーション設定の活用方法
それでは、実際にアプリケーション設定を使う方法を示そう。
.NET Framework 2.0では非常に簡単に(アプリケーション構成ファイルやユーザー構成ファイルに保存された)アプリケーション設定にアクセスする手段が用意されている(その際、設定情報がユーザー構成ファイルに保存されていれば、アプリケーション構成ファイルの情報を暗黙的にオーバーライドして用いてくれる。その点を開発者は意識せずにコーディングできる)。
まずアプリケーション設定を取得するコードを示そう。
|
||
アプリケーション設定を取得するコード(上:C#、下:VB) | ||
入力する際にはIntelliSenseも効く。 |
ユーザー・スコープを指定したアプリケーション設定では、設定情報を上書きで保存することもできる。
|
||
アプリケーション設定を保存するコード(上:C#、下:VB) | ||
入力する際にはIntelliSenseも効く。 |
VS 2005のプロジェクト・プロパティでアプリケーション設定を行った場合、上記コードを見て分かるように、
- C#:「<既定の名前空間>.Properties.Settings.Default.<設定名>」
- VB:「My.Settings.<設定名>」
でアプリケーション設定にアクセスできる。
なおC#の例で「Properties」はフォルダ名を表す。「<既定の名前空間>.」や「Properties.」は名前空間であるため、(コンテキストによっては)省略できる。また「global::」というグローバル名前空間修飾子を指定しているが、この指定は必ずしも付けなければならないというわけではない。しかし、付けた方が「アプリケーション設定を取得・保存するクラス」と「既定の名前空間」で名前が同じになった場合に問題が起こらないので安全だ。
Saveメソッドを呼び出さないと、アプリケーション設定情報は保存されないので注意が必要だ。ただしVBで作成したWindowsフォーム・アプリケーションの場合、アプリケーションが終了する際に(厳密にはMy.Application.Shutdownイベントが発生した際に)、自動的に保存されるようになっている(※クラス・ライブラリやコンソール・アプリケーションでは自動的に保存されない)。
先ほどのVBのコード例ではMy機能を活用している。My機能を活用しない場合は、次のようなコードになる。
|
|
My機能を活用せずに組み込まれたアプリケーション設定にアクセスするコード(VB) |
つまり次のような形式でアクセスできる。
- VB:「<ルート名前空間>.My.MySettings.Default.<設定名>」
特に「My.MySettings」となるところに注意してほしい。「<ルート名前空間>」は(コンテキストによっては)省略できる。「Global.」はグローバル名前空間修飾子である。前述のC#と同じ理由で、付けなくても動作するが、付けた方が安全だ。
なお本稿で紹介した方法でアクセスできるアプリケーション設定は、上記のプロジェクト・プロパティの[設定]タブで保存したものだけである。別プロジェクトで保存したアプリケーション設定にはアクセスできない。
ただし、プロジェクト内で独自に.settingsファイル(設定ファイル)を追加した場合には、そのファイルも対してもほぼ同様の手法でアクセス可能になる。これについては「TIPS:独自のアプリケーション設定(.settingsファイル)を活用するには?」(後日公開予定)で紹介する。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Windowsフォーム 処理対象:構成ファイル カテゴリ:クラス・ライブラリ 処理対象:構成ファイル 関連TIPS:アプリケーション設定情報はどこに保存すべきか? 関連TIPS:Windowsアプリケーションの位置やサイズを保存するには? 関連TIPS:独自のアプリケーション設定(.settingsファイル)を活用するには?(後日公開予定) |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|