本記事は、[C#での設定ファイル管理とパラメータのバージョンアップ]の続きとして、アプリケーション構成ファイル(app.config)による設定情報やパラメータの扱いについて記載します。Visual Studioを使って開発する際(必ずしも、VSでなくても可能ですが)、構成ファイルを使う方法がいくつかありますが、本記載ではapp.configについて記載します。
Contents
App.configを使うための準備
app.configのファイルフォーマット
app.configもINIファイルのようなkeyとvalueを記述するになります。
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> <appSettings> <add key="ID" value="1002" /> <add key="Name" value="Suzuki" /> </appSettings> </configuration> |
Visual Studioでの設定
以下の図のようにプロジェクトの参照にSystem.Configuraitonを追加します。
app.configからの読み込みと書き込み
・ConfigurationManager.AppSettings[“key”]を使い、呼び出すことができます。keyとはapp.configファイルのkey部分に値する文字列です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
class ParamUserInfoControlAppConfig { public int ID { get; set; } public string Name { get; set; } /// <summary> /// app.configから呼び出し /// </summary> public void Load() { this.ID = GetValueInt(nameof(this.ID)); this.Name = GetValueString(nameof(this.Name)); } /// <summary> /// app.configへ書き込み /// </summary> public void Write() { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); WriteValue(config,nameof(this.ID), this.ID.ToString()); WriteValue(config, nameof(this.Name), this.Name); config.Save(); } public static int GetValueInt(string key) { return int.Parse(ConfigurationManager.AppSettings[key]); } public static string GetValueString(string key) { return ConfigurationManager.AppSettings[key]; } public static void WriteValue(Configuration config, string key,string sValue) { config.AppSettings.Settings[key].Value = sValue; } } |
Getxx関数を分けていますが、もっと使いたい場合は、Genericを使い文字列を欲しい方へ変換する関数を用意すると良いでしょう。
app.configによる読み書きの注意点と対策
上記の[src1.2]は、exeが存在するフォルダに、{EXE名}.exe.Configとして保存されます。1つのPCに一つのバージョンしかインストールできないアプリケーションの場合は影響が少ないですが、一つのPCに複数バージョンをインストール可能にし、ユーザが欲しいバージョンを起動するようにしたい場合は、バージョン毎にconfigファイルが存在し、新しいバージョンを入れた場合に、どのフォルダのconfigから読みだすべきか分からなくなります。そこで、以下のようにconfigファイルのパスを指定すると良いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
class ParamUserInfoControlEx { public int ID { get; set; } public string Name { get; set; } private string _configFile = @"c:\temp\Param_AppConfig.exe.Config"; /// <summary> /// app.configから呼び出し /// </summary> public void Load() { var exeFileMap = new ExeConfigurationFileMap { ExeConfigFilename = _configFile }; var configx = ConfigurationManager.OpenMappedExeConfiguration(exeFileMap, ConfigurationUserLevel.None); this.ID = int.Parse(configx.AppSettings.Settings[nameof(this.ID)].Value); this.Name = configx.AppSettings.Settings[nameof(this.Name)].Value; } /// <summary> /// app.configへ書き込み /// </summary> public void Write() { var exeFileMap = new ExeConfigurationFileMap { ExeConfigFilename = _configFile }; var config = ConfigurationManager.OpenMappedExeConfiguration(exeFileMap, ConfigurationUserLevel.None); config.AppSettings.Settings[nameof(this.ID)].Value = this.ID.ToString(); config.AppSettings.Settings[nameof(this.Name)].Value = this.Name; config.Save(); } public static void WriteValue(Configuration config, string key, string sValue) { config.AppSettings.Settings[key].Value = sValue; } } |
このサンプルは、指定したファイルパスにconfigファイルを保存し、読み込むことができるので、以下の使い方ができます。
- 同じアプリケーションを複数バージョンインストールする必要がある場合、設定ファイルパスを固定にする。
- アプリケーション内で複数の設定ファイルを持ち、それぞれ読み書きしたい。
パラメータバージョンアップにおけるApp.Config管理による影響
バージョンアップのないアプリケーションは基本ありえないので、バージョンアップを考慮し、注意点と対策欄で記述とおり、ファイル名を指定して実装すると良いです。また、この方法は、INIファイルやレジストリを扱う方法と同じく、クラス情報をそのままレジストリに保存することはなく、一度、変換を行うことになる。そのため、INIファイルによる設定ファイルの管理と同じく、パラメータバージョンアップの際も、基本は影響を受けません。なので、クラスのメンバー毎に読み込みと書き込みの変換の実装が必要ですが、その分、バージョンアップによってパラメータが増えても素直に実装できるメリットがあるのが特徴です。
まとめ
app.configによるパラメータ管理は、ファイル名を指定できるようにします。app.configとGUIなどの画面用のデータクラスに対し、パラメータ変換が必要になるので、大規模プロジェクトでは本当に必要な一部分(アプリケーションのサイズ、位置情報とか)に対して使うと良いでしょう。