C#

【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)\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="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になっていることが確認できます。

エンジニアの転職ならこれ!

【第二新卒向け】マイナビジョブ20's

マイナビジョブ20'sは、20代・第二新卒・既卒向けの転職エージェントです。

▼こんな方におすすめ
・はじめて転職しようと思っている
・転職できるだけのスキルが自分にあるか不安
・手厚いサポートを受けたい

【フリーランス向け】 Midworks

Midworksは豊富な案件と「フリーランス」と「正社員」の良いとこ取りをした働き方を実現する手厚い保障が特徴です。

▼こんな方におすすめ
・現在正社員でフリーランスになろうか悩んでいる
・フリーランスとして働いているが、先行きが不安がある  (安定的な案件確保や保障など)
・自分の市場価値を知りたい、見合った案件で参画したい
・今後のキャリアビジョンを踏まえて案件を選びたい