C# - App.ConfigをDebugとReleaseで使い分ける

 

C#のアプリケーションでは設定情報を格納しておくためのファイルとして「App.Config」がありますが、開発時点ではテスト用の設定情報を利用したい場合もあります。
Debugビルドの時とReleaseビルドの時で App.Config を使い分けることができれば便利ですね。


Debug用とRelease用のApp.Configを準備する

Debugビルドの時に使用するファイルとして「App.Debug.config」を、

Releaseビルドの時に使用するファイルとして「App.Release.config」をそれぞれ作成します。

 

 

全てのビルドで共通する設定は「App.Config」へ記述し、

Debugビルド時に専用の値にしたい設定は「App.Debug.Config」へ

Releaseビルド時に専用の値にしたい設定は「App.Release.Config」へ記述するという感じです。

以下のようなサンプルのApp.Configで解説します。

「TestKey1」と「TestKey2」というキーがありますが、このうち「TestKey2」の値をDebugとReleaseで別々の値にするという使い方の例になります。

App.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1" />
    </startup>
    <appSettings>
        <add key="TestKey1" value="KEY1です!" />
        <add key="TestKey2" value="KEY2です!" />
    </appSettings>
</configuration>

App.Debug.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <appSettings>
        <add key="TestKey2" value="KEY2です!(debug)" xdt:Transform="Replace" xdt:Locator="Match(key)" />
    </appSettings>
</configuration>

App.Release.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <appSettings>
        <add key="TestKey2" value="KEY2です!(release)" xdt:Transform="Replace" xdt:Locator="Match(key)" />
    </appSettings>
</configuration>

「App.Debug.Config」と「App.Release.Config」には <configuration> タグに

xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" という属性を追加します。

また <add>タグにも  xdt:Transform="Replace" xdt:Locator="Match(key)" という属性を追加します。

App.Debug.ConfigとApp.Release.Configプロジェクトへ追加

作成した「App.Debug.Config」と「App.Release.Config」の2つのファイルをプロジェクトに追加しましょう。

ただ普通に追加すると App.Config と並列に並んでしまいますね。

App.Config のサブ階層になるようにするためにプロジェクトファイル(.csproj)を編集しましょう。

下記のような部分を探して・・・

[アプリ名].csproj ※編集前

    <None Include="App.Debug.config" />
    <None Include="App.Release.config" />

こんな感じに書き換えます。

[アプリ名].csproj ※編集後

    <Content Include="App.Debug.config">
      <DependentUpon>App.config</DependentUpon>
      <SubType>Designer</SubType>
    </Content>
    <Content Include="App.Release.config">
      <DependentUpon>App.config</DependentUpon>
      <SubType>Designer</SubType>
    </Content>

プロジェクトファイルを編集する

プロジェクトファイル(.csproj)を編集して、ビルド構成に応じでconfigファイルを切り分けるための設定を追記します。プロジェクトファイルをテキストエディタなどで開いて <Project>タグの中に以下を追加しましょう。

[アプリ名].csproj

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterCompile" Condition="exists('app.$(Configuration).config')">
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <ItemGroup>
      <AppConfigWithTargetPath Remove="@(AppConfigWithTargetPath)" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

以上で設定は完了です。

Visual Studioを再起動してプロジェクトを読み直せば、ビルド構成によってconfigファイルが切り替わることが確認できると思います。