読者です 読者をやめる 読者になる 読者になる

ふるすたっくえんじにあっぽい人の日記

ASP .NET MVC (C#)、.NET Framework、iOS (Objective-c) アプリ、Androidアプリ (Java)、AWS、たまにLAMPとかプロジェクトマネジメントあたりのお話

.exe.configをDebugとReleaseで切り替える Visual Studio 2015編

.NET Framework

ひさびさ.NET
コンソールアプリケーションとかWindowsアプリケーションとかの場合ね。
Web.configは勝手にやってくれるのになぜ.exe.configはやってくれないのか
なお、.exe.configからの値の取得はWeb.configの時と一緒でございます。

参考:
devdevdev.hatenablog.com

1.おもむろにApp.config/App.Debug.config/App.Release.configをプロジェクトディレクトリ直下に作ります。
中身はこんな感じ

App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="foo" value="default" />
  </appSettings>
</configuration>

App.Debug.config - 特に書くことない

<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>

App.Release.config - Web.Release.configと同じ書き方でおk

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

2..csproj編集
ソリューションエクスプローラーからプロジェクト右クリック→プロジェクトのアンロード
もっかい右クリック→編集XXXX.csproj

まずItemGroup

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

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

に書き換え。

で、AfterCompileとAfterPublish追加。

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\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 Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>
  <Target Name="AfterPublish">
    <PropertyGroup>
      <DeployedConfig>$(_DeploymentApplicationDir)$(TargetName)$(TargetExt).config$(_DeploymentFileMappingExtension)</DeployedConfig>
    </PropertyGroup>
    <Copy Condition="Exists('$(DeployedConfig)')" SourceFiles="$(IntermediateOutputPath)$(TargetFileName).config" DestinationFiles="$(DeployedConfig)" />
  </Target>

以上。

長々書いたけど、これ使ったら一発な模様。
プレビューもできるらしい。
visualstudiogallery.msdn.microsoft.com