【C#】App.configの内容をDebugとReleaseで分ける

コンソールやWPFアプリの場合に、ビルド構成別にApp.configを分ける方法を記載します。
Debug(開発環境)とRelease(本番環境)でApp.config内のDBのIPをそれぞれ自動的に設定する場合の対応方法です。

【検証環境】.NET Framework 4.7.2

プロジェクトにApp.Release.configを追加する

※開発環境のIPが192.168.1.1 / 本番環境のIPが192.168.2.1 とします。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <connectionStrings>
    <add name="hogename"
         connectionString="~~~; data source=192.168.1.1; ~~~;"
         providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

上記の様なApp.configがある状態で、同じ階層に下記のファイルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <connectionStrings>
    <add name="hogename"
         connectionString="~~~; data source=192.168.2.1; ~~~;"
         providerName="System.Data.EntityClient"
         xdt:Transform="Replace" xdt:Locator="Match(name)"/> 
  </connectionStrings>
</configuration>

App.configとの差異は、2行目のconfigurationタグに下記追加

xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"

また、addタグ内に下記追加

xdt:Transform="Replace" xdt:Locator="Match(name)"

プロジェクトファイル(.csproj)の修正

まずプロジェクトをアンロードして、プロジェクトファイルを編集します。

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

上記を下記に修正します

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

また、下記をProjectタグ内に追記して保存、プロジェクトの再読み込みを行います。

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)MicrosoftVisualStudiov$(VisualStudioVersion)WebMicrosoft.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="app.config" />-->
      <AppConfigWithTargetPath Remove="@(AppConfigWithTargetPath)" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

そうするとソリューションエクスプローラからみると、App.config内にApp.Release.configが含まれているようになります。

ビルド

この状態でビルドをDebugとReleaseでそれぞれ行います。
exe.configを確認してみるとそれぞれの環境のIPになっていることが確認できます。

Leave a Reply

Your email address will not be published. Required fields are marked *