質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

3回答

7133閲覧

VisualStudio2013 複数プロジェクトでのコンパイルスイッチ

TEC_S

総合スコア79

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

1クリップ

投稿2020/02/13 10:06

編集2020/02/13 14:11

前提・実現したいこと

Visual Studio2013で、ソースコード管理について、ご相談です。
リリースをビルドする際、事情があり、有効にしたくない(客先事情)ソースコードがあるプロジェクトにて、下記条件で効率的に管理をするにはどういう方法があるのか、ご教授願いたく、投稿しました。

・ソースコードベースで管理したい(該当ソースコードのようなイメージ)
・Gitなどは使わない

[追記]
構成を理解していませんでした。申し訳ありません。
ソリューションの中に、複数プロジェクトがあり、1つのソリューションを一括で管理したいと考えています。そのような方法、ないでしょうか。。。

発生している問題

可能であれば、VB.NETのコンパイルスイッチのような、一発で切替できる管理をしたい(現状、調べた限りでは、そういう機能がない??)

該当のソースコード

例えば、今であれば、#if / #end if でソースを管理しています。(管理といっていいのか・・・)
また、通常はGitなどを使ってはいるのですが・・・
今回は、ソースコード上での切替が出来るのがベストだという事を言われています。。。(個人的には、Gitでの差分確認で良いと思うのですが・・・それはNG)

C#

1 2#if true // Ver.〇〇より追加/変更 3  ・ 4  ・ 5  ソースコード 6  ・ 7  ・ 8#else //変更時はこれ以降に以前のコード(追加時はない) 9  ・ 10  ・ 11#endif

これだと、一つ一つ確認していく必要があるので、漏れが出る可能性が高く(管理しにくく)問題だと考えています。

調査した内容

  1. #defineを使用する

コンパイラオプションを設定して、有効/無効のソースコードを分ける
参考:https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/define-compiler-option

 → 自分の理解では、ソースファイル一つずつに宣言をしないといけないので、現実的ではない?

C#

1#define No_Relese 2Using System; 3 ・ 4 ・ 5 ・ 6 7namespace 〇〇 8{ 9 ・ 10 ・ 11 ・ 12 13}

2)条件付きコンパイル
https://dobon.net/vb/dotnet/programing/define.html

 → まさにこれだっと思ったのですが、構成プロパティ―になぜか「ビルド」が表示されていない。
VisualStudioのオプション → プロジェクトおよびソリューション → 全般 → 「ビルド構成の詳細を表示(I)」のチェックが入っていることを確認。
イメージ説明

プロジェクトのプロパティ(複数のプロジェクトが1つのソリューションにある)
イメージ説明

この使い方は、#defineの使い方と同様の使い方しか出来なそう...

補足情報(FW/ツールのバージョンなど)

OS:Windows10
開発環境:Visual Studio2013 / .NetFramwork4.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alg

2020/02/13 10:36

.NET Framework のバージョンはいくつでしょうか?
dodox86

2020/02/13 10:48

> まさにこれだっと思ったのですが、構成プロパティ―になぜか「ビルド」が表示されていない。 「ソリューション」のプロパティを見ているのだと思います。「プロジェクト」のプロパティで確認してください。
TEC_S

2020/02/13 13:17

ご指摘、ありがとうございます。 分かる範囲・・・修正しました。 プロジェクトのプロパティ、、やはり見ている所が違いますか??
guest

回答3

0

ベストアンサー

プロジェクトでビルド時に指定するシンボル(#defineで指定するもの)は、プロジェクトファイル*.csproj 内でDefineConstants要素で指定されています。ビルドの前に、各プロジェクトの *.csprojファイルのこの要素部分を、何らかのスクリプト(バッチファイルでも、PowerShellスクリプトでも何でも)で書き換えた後、ビルドすることで一応は用を成すことができます。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> ... <DefineConstants>TRACE;DEBUG;<追加したいシンボル></DefineConstants> ... </PropertyGroup>

ただ、プロジェクトの「ビルドイベント」、「ビルド前イベントのコマンドライン」でこれができれば良いですが、ビルド時は*.csprojファイルが使用中である為、難しいでしょう。ビルドする前にあらかじめ実行しておく必要があるかと思います。

で、#defineで指定するシンボルを、外部で定義できると目的を果たせそうです。

Visual Studioの「開発者コマンドプロンプト」上では、ご存じのようにdevenvコマンドでビルドすることができます。ここで、環境変数を指定してみます。

方法: ビルドで環境変数を使用する - Visual Studio 2015
※Visual Studio 2015に関する記事ですが、お使いのVisual Studio 2013ならほぼ同じはずです。

例えば上記、*.csprojファイルの<PropertyGroup><DefineConstants>相当の部分に$(EXTRA_VARS)と入力します。(EXTRA_VARSと言うのは便宜上の名前です。適当に変えてください)

イメージ説明

Visual Studioの「開発者コマンドプロンプト」上で、環境変数EXTRA_VARSの値にシンボルとしてDEFVAR1DEFVAR3;で区切って指定します。確認の為、あえてDEFVAR2を除外しておきます。

CMD

1C:\work>set EXTRA_VARS=DEFVAR1;DEFVAR3 2 3C:\work>echo %EXTRA_VARS% 4DEFVAR1;DEFVAR3

DEFVAR1DEFVAR2DEFVAR3のシンボルを利用する以下のコードを例として

C#

1using System; 2 3namespace ConApp1 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 Console.WriteLine("*** start."); 10#if DEFVAR1 11#warning "DEFVAR1 defined." 12 Console.WriteLine("--- DEFVAR1"); 13#endif 14 15#if DEFVAR2 16#warning "DEFVAR2 defined." 17 Console.WriteLine("--- DEFVAR2"); 18#endif 19 20#if DEFVAR3 21#warning "DEFVAR3 defined." 22 Console.WriteLine("--- DEFVAR3"); 23#endif 24 Console.WriteLine("*** done."); 25 } 26 } 27}

devenvコマンドでソリューションファイル ConApp1.slnを指定し、rebuildします。

CMD

1C:\work>devenv /rebuild debug ConApp1.sln 2 3Microsoft (R) Microsoft Visual Studio 2012 Version 11.0.61219.0. 4Copyright (C) Microsoft Corp. All rights reserved. 51>------ すべてのリビルド開始: プロジェクト: ConApp1, 構成: Debug Any CPU ------ 61>C:\work\Program.cs(11,10,11,28): warning CS1030: #warning: '"DEFVAR1 defined."' 71>C:\work\Program.cs(21,10,21,28): warning CS1030: #warning: '"DEFVAR3 defined."' 81> ConApp1 -> C:\work\bin\Debug\ConApp1.exe 9========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========

コード中に記述した#warningプリプロセッサ命令がビルド中に実行されていることが分かります。

ビルドした実行ファイルを実際に実行してみます。DEFVAR2部分が無いことが分かります。

CMD

1C:\work>bin\Debug\ConApp1.exe 2*** start. 3--- DEFVAR1 4--- DEFVAR3 5*** done. 6 7C:\work>

この方法ならば、各プロジェクトで共通の環境変数の値を利用してコンパイル時の条件を制御できるでしょう。(尚、上記実行例は、Visual Studio 2012で確認したものです)

Visual Studio でのビルド時に使われる「MSBuild」に関する情報を踏まえておくと、より高度なことができると思います。

投稿2020/02/14 00:42

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TEC_S

2020/02/14 06:15

ありがとうございます。 頂いた情報で、実現できました!!
guest

0

menu: ビルド > 構成マネージャ
で、ソリューション構成を追加しオプションを変更する

もしくは

プロジェクトを複数起こす

あるいは

共通部分をライブラリ化し、
複数プロジェクトを起こしてライブラリ+差分コード でビルドする。

※ 思いつくまま...

投稿2020/02/13 19:23

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TEC_S

2020/02/14 05:18

ありがとうございます!!
guest

0

dodox86さんも指摘されていますが、
ソリューションエクスプローラー>プロジェクト>右クリック>プロパティ>ビルド>条件付きコンパイルシンボル
で指定できます。

下の画面はVisualStuido2019ですが、だいたい同じだと思います。
イメージ説明

投稿2020/02/13 13:08

soi013

総合スコア149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TEC_S

2020/02/13 14:20

ありがとうございます。 条件つきコンパイルシンボルを見つけれました。 しかし、自分の当初やりたい内容が的確に分かっておらず・・・条件つきコンパイルシンボルをしているすだけでは、自分の意図(複数プロジェクトがあるソリューション全てを一つのコンパイルスイッチで管理したい)を可能とするものではありませんでした。 申し訳ありませんが、タイトルと内容を修正させて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問