delete from hateblo.jp where 1=1;

タイトルに意味はありません。

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マージツールを即席で作成したので、ご活用ください。

ライセンスはMITライセンスになっていますが、原則WTFPL2で、無保証です。

参考文献

改ざん履歴

  • 2015/08/22 プロジェクトへのURLが誤っていたので修正
  • 2017/03/08 通常プロジェクトへ移行したことに伴い、URLを変更