.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でのアプリケーション設定の入力
プロジェクト・プロパティからアプリケーション設定を入力しているところ。プロジェクト・プロパティは、ソリューション・エクスプローラでプロジェクト項目を右クリックし、そこで表示されるコンテキスト・メニューから[プロパティ]を選択すると表示される。なお、このような画面が表示されずに「このプロジェクトには既定の設定ファイルが含まれて居ません。ファイルを作成するには、ここをクリックしてください。」というリンク・ラベルが表示されている場合は、それをクリックすることでこの画面が表示される。
  プロジェクト・プロパティで[設定]タブを開く。
  それぞれのアプリケーション設定に対して名前を付ける(この例では「Edition」)。プログラム中でアプリケーション設定を使う際には、ここで指定した名前(=設定名)でアクセスすることになる。
  値の型。「string」(String)だけでなく、「int」(Integer)や「bool」(Boolean)などさまざまな型をサポートしており、必要であれば「参照...」から任意の型を選択できる。そのほか、データベースへ接続するための「(接続文字列)」などが選択できる。
  スコープ。アプリケーション設定が用いられる範囲を、「アプリケーション」もしくは「ユーザー」から選択する。
  アプリケーション設定の実際の設定値。ここでは「デモ版」と入力した。

 ここで設定した内容は、(基本的に)プロジェクト配下のプロジェクト・プロパティ用のフォルダ(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(
      ConfigurationUserLevel.None).FilePath
  → 構成ファイルのパスを取得するコード(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\Application Data\Digital_Advantage\ConsoleApplication1.exe_Url_sapx1uhq5k52g0bhyc1sd3t1r0h1e0ih\1.0.0.0\user.config
  → 構成ファイルのパスを取得するコード:
      ConfigurationManager.OpenExeConfiguration(
      ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath
 
【ローミング・ユーザーに対するユーザー構成ファイル(user.config)】の配置場所
  ローミング・ユーザーごとのアプリケーション・データ・フォルダの配下
  → Windows XP環境でのファイル・パスの例:
      C:\Documents and Settings\masa-i.D-ADVANTAGE\Application Data\Digital_Advantage\ConsoleApplication1.exe_Url_sapx1uhq5k52g0bhyc1sd3t1r0h1e0ih\1.0.0.0\user.config
  → 構成ファイルのパスを取得するコード:
      ConfigurationManager.OpenExeConfiguration(
      ConfigurationUserLevel.PerUserRoaming).FilePath

 .NET Framework 2.0の基本的な方針からいえば、ローミング・ユーザーでアプリケーションを実行している場合、当然ながらローミング・ユーザーに対するユーザー構成ファイル(user.config)を使う必要がある。しかし、VS 2005の(ユーザー・スコープを指定した)アプリケーション設定の機能では、

ローミング・ユーザーであったとしても、ローカル・ユーザー(=非ローミング・ユーザー)に対するユーザー構成ファイル(user.config)が使われる

という仕様になっているようである。

アプリケーション設定の活用方法

 それでは、実際にアプリケーション設定を使う方法を示そう。

 .NET Framework 2.0では非常に簡単に(アプリケーション構成ファイルやユーザー構成ファイルに保存された)アプリケーション設定にアクセスする手段が用意されている(その際、設定情報がユーザー構成ファイルに保存されていれば、アプリケーション構成ファイルの情報を暗黙的にオーバーライドして用いてくれる。その点を開発者は意識せずにコーディングできる)。

 まずアプリケーション設定を取得するコードを示そう。

string アプリケーション設定 =
  global::ConsoleApplication1.Properties.Settings.Default.Edition;
Dim アプリケーション設定 As String = My.Settings.Edition
アプリケーション設定を取得するコード(上:C#、下:VB)
入力する際にはIntelliSenseも効く。

 ユーザー・スコープを指定したアプリケーション設定では、設定情報を上書きで保存することもできる。

global::ConsoleApplication1.Properties.Settings.Default.Edition =
  "アプリケーション設定を保存できます。";
global::ConsoleApplication1.Properties.Settings.Default.Save();
My.Settings.Edition = "アプリケーション設定を保存できます。";
My.Settings.Save()
アプリケーション設定を保存するコード(上: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機能を活用しない場合は、次のようなコードになる。

Dim アプリケーション設定 As String = _
  Global.ConsoleApplication1.My.MySettings.Default.Edition
My機能を活用せずに組み込まれたアプリケーション設定にアクセスするコード(VB)

 つまり次のような形式でアクセスできる。

  • VB:「<ルート名前空間>.My.MySettings.Default.<設定名>」

 特に「My.MySettings」となるところに注意してほしい。「<ルート名前空間>」は(コンテキストによっては)省略できる。「Global.」はグローバル名前空間修飾子である。前述のC#と同じ理由で、付けなくても動作するが、付けた方が安全だ。

 なお本稿で紹介した方法でアクセスできるアプリケーション設定は、上記のプロジェクト・プロパティの[設定]タブで保存したものだけである。別プロジェクトで保存したアプリケーション設定にはアクセスできない。

 ただし、プロジェクト内で独自に.settingsファイル(設定ファイル)を追加した場合には、そのファイルも対してもほぼ同様の手法でアクセス可能になる。これについては「TIPS:独自のアプリケーション設定(.settingsファイル)を活用するには?」(後日公開予定)で紹介する。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Windowsフォーム 処理対象:構成ファイル
カテゴリ:クラス・ライブラリ 処理対象:構成ファイル
関連TIPS:アプリケーション設定情報はどこに保存すべきか?
関連TIPS:Windowsアプリケーションの位置やサイズを保存するには?
関連TIPS:独自のアプリケーション設定(.settingsファイル)を活用するには?(後日公開予定)

この記事と関連性の高い別の.NET TIPS
独自のアプリケーション設定(.settingsファイル)を活用するには?
Windowsフォームで構成ファイルによりプロパティ値を設定するには?
Windowsアプリケーションの位置やサイズを保存するには?
[ASP.NET]アプリケーション個別の構成ファイルの変更を禁止するには?
[ASP.NET]ページから生成されたソース・コードを見るには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間