コンソールや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になっていることが確認できます。