メインコンテンツまでスキップ

環境ごとのapp.configの切り替え

土井
ディアシステム(株)開発一部第2課

こんにちは。開発一部の土井です。
普段、業務で C#を使っているのですが、テストから本番に移すときなど、アプリケーション構成ファイル内の設定値を手動で変更しておりましたが、手間だったり、ミスも起こりやすいと思い調べていたところ良さそうな方法を見つけたので、ここに書きたいと思います。

動作環境

  • Visual Studio Community 2022
  • .NET6.0

今回行いたいことは、ソリューション構成(Debug,Release)の切り替えにより、アプリケーション構成ファイル(app.config)の内容が変更されるようにすることです。

画像1

画像2

結論から方法を伝えると、プロジェクトの csproj ファイルへ以下の設定情報を追加することで可能です。

<!-- Debug構成時 -->
<Target Name="CopyConfigDebug" Condition="'$(Configuration)' == 'Debug'" BeforeTargets="BeforeBuild">
<Copy SourceFiles="App.$(Configuration).config" DestinationFiles="app.config" />
</Target>

<!-- Release構成時 -->
<Target Name="CopyConfigRelease" Condition="'$(Configuration)' == 'Release'" BeforeTargets="BeforeBuild">
<Copy SourceFiles="App.$(Configuration).config" DestinationFiles="app.config" />
</Target>

各要素について、ご説明します。

<Target Name="CopyConfigDebug" Condition="'$(Configuration)' == 'Debug'" BeforeTargets="BeforeBuild">

<Target> はビルド中に実行するタスクを定義します。
Name はこの要素の名前です。
Condition は要素を有効にするかどうかを決めます。 ’$(Configuration)’ がソリューション構成の値です。つまり、今回の場合だとソリューション構成が’Debug’となっている場合に <Target> 内のタスクを有効にするということになります。
BeforeTargets はこの <Target> をどのタイミングで実行するかというものです。今回の場合は ”BeforeBuild” となっており、ビルド前に実行するということになります。

<Copy SourceFiles="App.$(Configuration).config" DestinationFiles="app.config" />

<Copy>はその名前の通りコピーを行う要素です。 SourceFiles がコピー元で、DestinationFiles が貼り付け先となります。

つまり、ソリューション構成が Debug のときは App.Debug.config を、Release のときは App.Release.config を、それぞれ ビルドの前に app.config に上書きコピーします。

以下、設定情報追加後の csproj ファイル

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<!-- Debug構成時 -->
<Target Name="CopyConfigDebug" Condition="'$(Configuration)' == 'Debug'" BeforeTargets="BeforeBuild">
<Copy SourceFiles="App.$(Configuration).config" DestinationFiles="app.config" />
</Target>

<!-- Release構成時 -->
<Target Name="CopyConfigRelease" Condition="'$(Configuration)' == 'Release'" BeforeTargets="BeforeBuild">
<Copy SourceFiles="App.$(Configuration).config" DestinationFiles="app.config" />
</Target>

</Project>

これで、ソリューション構成を切り替えることで App.Config の中身を切り替えることができます。
少し注意点ですが、ビルドを実行することで App.config の中身が切り替わるので、必ずソリューション構成を切り替えた後にビルドを行ってください。

ここからはおまけになりますが、csproj の他の要素についてご説明します。
<Project Sdk="Microsoft.NET.Sdk">
プロジェクト内でどの SDK を使うか定義しています。

<PropertyGroup>
プロジェクトのビルドや振る舞いの基本設定をまとめています。

<OutputType>
出力の種類を決めています。今回だと実行ファイル(.exe)を出力します。

<TargetFramework>
対応する.NET のバージョンを指定します。

<ImplicitUsings>
Using を自動で補完してくれる機能の使用可否を決めます。例えば、using System;と明示しなくても良くなります。

<Nullable>
Null に関しての安全なコードを書くためのチェックが有効になります。

他にも様々な要素が存在しますが、全ては書ききれないので一番初めからある基本的なものだけ説明しました。

ここまで csproj について説明しました。
今回は app.config の内容を丸々上書きするという内容でしたが、一部要素だけ書き換えるという方法もあるようでした。(なぜか上手くできませんでした。)
今後はこの方法で設定値を環境ごとに切り替えようと思います。