DLLのapp.configでアプリケーション設定を*.exe.configから反映させる方法
対象
以下の条件下できっと問題になるはず。
- .Net Framework 2.0以降
- アプリケーションのexeとライブラリdllがある環境
- DLLでSettings.settingsを利用している場合
このとき、問題になるのが以下のような点だろう。
- DLL側のアプリケーションの設定を変更する手立てがない
- アプリケーションは*.exe.configに記載されているので、その部分を変更すれば、反映することが出来る
対策方法
DLL側のapp.configとアプリケーション側のapp.configをマージする。
たったこれだけですべて解決する。
解析
プロジェクト構成
- dlltests (ソリューション)
- dlltests (アプリケーション)
- ClassDao (クラスライブラリ)
ClassDao(クラスライブラリ) のapp.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="ClassDao.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <applicationSettings> <ClassDao.Properties.Settings> <setting name="AppSettings" serializeAs="String"> <value /> </setting> </ClassDao.Properties.Settings> </applicationSettings> </configuration>
dlltest(アプリケーション) のapp.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="dlltests.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <applicationSettings> <dlltests.Properties.Settings> <setting name="Settingaaa" serializeAs="String"> <value>testdata</value> </setting> </dlltests.Properties.Settings> </applicationSettings> </configuration>
構文解析
以下のような構成になっていることが確認できる。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <!--ここに <section name="名前空間名.Properties.Settings" (中略) /> で名前空間の定義がされる --> </sectionGroup> </configSections> <applicationSettings> <!-- ここにアプリケーションの設定が記述される--> <名前空間名.Properties.Settings> <setting name="キー" serializeAs="型"> <value>値</value> </setting> </名前空間名.Properties.Settings> </applicationSettings> <userSettings> <!-- ここにユーザーの設定が記述される。ただし、通常の保存場所はログインユーザーのローカル設定フォルダとなる。(ここの値はアプリケーションから変更されない)--> <名前空間名.Properties.Settings> <setting name="キー" serializeAs="型"> <value>値</value> </setting> </名前空間名.Properties.Settings> </userSettings> </configuration>
マージ
結果を踏まえて、マージすると、以下のようなファイルになる。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="ClassDao.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <section name="dlltests.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <applicationSettings> <ClassDao.Properties.Settings> <setting name="AppSettings" serializeAs="String"> <value /> </setting> </ClassDao.Properties.Settings> <dlltests.Properties.Settings> <setting name="Settingaaa" serializeAs="String"> <value>testdata</value> </setting> </dlltests.Properties.Settings> </applicationSettings> </configuration>
検証を行うため、ClassDaoの値を変更して、アプリケーションを実行してDLL側の設定値を確認する。
そうすると、値が書き変わっていることが確認できる。
結論
使用するDLLすべてのapp.configを(それぞれの)アプリケーションのapp.configへマージする。
この手順で解決できるので、XMLをマージできるプログラムを探したのだが、いまいち見つからなかったので、サクッと作ってみた。後日公開予定。
ちなみに、web.configでも同様の対策でいけるはずです。
ツール
XMLマージツールを即席で作成したので、ご活用ください。
- ソリューション、ソースコード
- プログラム本体
- 以下のコマンドを実行してください。
- XmlComplex.exe -o=[出力ファイル] [入力元ファイル] [入力元ファイル]...
ライセンスはMITライセンスになっていますが、原則WTFPL2で、無保証です。
参考文献
- DLLのapp.configについて - QA@IT
- 「アプリケーション構成ファイル」を使用して設定を読み込む - .NET Tips (VB.NET,C#...)
- App.config dll - Google 検索 (検索結果へのリンク)
- C Sharp/DLLのApp.config - MonoBook こういう解決策もなかなかいいので、見ると良いです。(当時は思いつかなかった)
- DLLのApp.config
改ざん履歴
- 2015/08/22 プロジェクトへのURLが誤っていたので修正
- 2017/03/08 通常プロジェクトへ移行したことに伴い、URLを変更