247
VisualStudio C# .NET Framewok という環境でWindows用のアプリを開発しています。
このアプリは外部のサーバーと通信を行っております。 サーバは、devel環境、staging環境、production環境の３つが用意されております。
それに伴い、アプリも各環境用に、サーバーの指し先を変えたものをビルドしたいです。

（Android開発で言うところのflavorのような機能を期待しています)

よろしくお願いいたします。
CC BY-SA 3.0
2014-12-02T06:43:20.927
241
2014-12-19T14:04:43.443
2014-12-03T14:35:09.090
33
427
question
.net visual-studio c# build
VisualStudio C# .NET Framewok で、どのように複数環境のビルドをしますか
それぞれの環境用にソリューションの構成を用意すればいいと思います。

## ソリューションの構成を追加する

Visual Studioのメニューから[ビルド]-[構成マネージャー]を開いて、 構成マネージャーのダイアログにある[アクティブ
ソリューション構成]のドロップダウンから [＜新規作成...＞]を選択します。

そうすると「新しい構成マネージャー」が表示されるので、名前をたとえば「devel」「staging」「production」にしたものを追加します。

別の構成をコピーして新しい構成を作成する場合には「設定のコピー元」を選択します。

### 構成毎にビルドするプロジェクトを切り替える必要がある場合

「新しいプロジェクト構成を作成する」にチェックをつけて新しい構成を作成します。 その後、構成マネージャー画面で[アクティブ
ソリューション構成]を切り替えて、 それぞれの構成においてビルドするものとしないものを設定します。

「新しいプロジェクト構成」を追加した場合には それぞれのプロジェクトのプロパティ画面を開くと
[ビルド]や[デバッグ]のページにある[構成]のドロップダウンにも項目が追加されているので、
追加された構成用のビルド設定やデバッグ設定を指定できるようになります。

## 構成によってサーバーの指し先を変える

プロジェクトのプロパティページにある [ビルド]-[全般]-[条件付きコンパイル シンボル]の値をそれぞれの構成で異なる値
(たとえば「devel」構成では`DEVEL`、「staging」構成では`STAGING`、
「production」構成では`PRODUCTION`)になるようにして、 コード側では

```

    #if DEVEL
      var serverAddress = "<devel server address>";
    #elif STAGING
      var serverAddress = "<staging server address>";
    #elif PRODUCTION
      var serverAddress = "<production server address>";
    #endif
    
```

というようにしてやればいいのではないでしょうか。

# あるいはもう少しスマートな方法があるかもしれませんが。。。
CC BY-SA 3.0
2014-12-02T08:54:16.377
247
2014-12-04T17:11:53.040
2014-12-04T17:11:53.040
30
295
241
answer
アプリケーション設定ファイル機能等の外部設定ファイルに書き出してしまう方法はいかがでしょうか。

ビルドしたバイナリは変えずに、設定ファイルを書き換えてしまう。
CC BY-SA 3.0
2014-12-02T14:31:34.793
264
2014-12-02T14:31:34.793
700
241
answer
こちらの質問は、実行時にアプリが参照するWebサービスのURIを構成するには、と読み取れます。

.NET Framework でデスクトップアプリ(Windows Forms や WPF)を作成すると、プロジェクトに App.config
というファイルが生成されます。こちらのファイルに appSetting タグを加え、add タグで URI
を指定する部分を追加し、アプリ側から読み込めば大丈夫です。

App.config の例:

```

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
      <appSettings>
        <add key="serverUri" value="http://hogehoge.com/service1"/>
      </appSettings>
    </configuration>
    
```

クライアントアプリから URL の参照

```

    var url = System.Configuration.ConfigurationManager.AppSettings["serverUri"];
    
```

後は、作成したアプリをdev, staging, production用に異なる３つのフォルダに分けてにコピーし、App.config の
serverUriのvalue部分を、それぞれのサーバー用に変更します。 そうすれば、ビルドは一つで、サーバーURLの変更の際に、再ビルドは不要になります。
CC BY-SA 3.0
2014-12-16T05:32:10.963
1675
2014-12-16T05:32:10.963
2099
241
answer
基本的には他の方の回答と同じで、ソースコード内のロジックではなく接続先だけを変えたいのであれば、
設定ファイル(App.config)内に切り出して、環境ごとにビルド構成を作成し設定ファイルを編集する前提で、ソースコードからはその設定ファイルを参照する、という方法でいいかと思います。

ただ、ビルド構成ごとに設定ファイルを切り替えるという意味では、同じ .NET でもWebアプリ(ASP.NET)であれば、Web.config
変換という便利なものがありまして、「devel」「staging」「production」というビルド構成であれば、

  * Web.devel.config 
  * Web.staging.config
  * Web.producion.config

という3つのファイルを用意して、ビルド時にXSLT変換によってWeb.configというファイルに変換してくれます。(もう一つデプロイ先ごとに変換する仕組みもありますが、この先の話に関係なくなるので割愛します)

前置きが長くなりましたが、クライアントアプリでもこのconfig変換と同じ仕組みを取りいれられる[Configuration Transform
というVisual
Studio拡張](https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859)があります。VisualStudio拡張ですが、一度VisualStudio上で適用すると、この拡張がないVisualStudio上でも、あるいはCIサーバーなどVisualStudioがない環境でも
Configuration Transform
が有効になります。[私のブログ](http://tech.tanaka733.net/entry/configuration-transform-
visual-studio-extension)になりますが、使い方を解説しております。
CC BY-SA 3.0
2014-12-19T14:04:43.443
2155
2014-12-19T14:04:43.443
2431
241
answer