web-dev-qa-db-ja.com

ソリューション全体の#define

#defineをグローバルに宣言する方法はありますか?

例えば、私が持っているファイルを持ちたいように、

#define MONO

そして、このプリプロセッサディレクティブが定義されていることをすべてのソースコードファイルに知らせる必要があります。どうすればそれを達成できますか?

49
bevacqua

更新:「ソリューション全体」の定義を行うことはできませんが、以下の回答はプロジェクトごとに実行できます。

コンパイルプロパティまたはビルドオプションで設定します。

http://msdn.Microsoft.com/en-US/library/76zdzba1(v = VS.80).aspx (VS2008) http://msdn.Microsoft.com/ en-US/library/76zdzba1(v = VS.100).aspx (VS2010)

「カスタム定数を設定するには」の見出しを参照してください。

更新

ビルドオプションに関するMicrosoftドキュメント

プロジェクトを右クリックして、メニューからプロパティを選択すると、ビルドオプションが表示されます。

Project Build Options

34
BJ Safdie

C#プロジェクトのソリューションを知っています(他のプロジェクトではテストしていません)

たとえば、あなたが持っている:

Project1\
Project2\
Solution1\Solution1.sln
Solution2\Solution2.sln

ソリューションディレクトリにSolutionDefines.targetsファイルを作成します

Project1\
Project2\
Solution1\Solution1.sln
Solution1\SolutionDefines.targets
Solution2\Solution2.sln
Solution2\SolutionDefines.targets
Solution3\Solution2.sln
Solution3\|no target file|

各プロジェクトファイルに以下を追加します。

<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />

Solution1\SolutionDefines.targets追加:

<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);TRACING_BUILD</DefineConstants>
    </PropertyGroup>
</Project>

Solution2\SolutionDefines.targets追加:

<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);ANOTHER_DEFINE</DefineConstants>
    </PropertyGroup>
</Project>

この場合、次のものがあります。

Solution1の場合-すべてのプロジェクトにTRACING_BUILD定義が追加されています

Solution2の場合-すべてのプロジェクトにANOTHER_DEFINE定義が追加されています

Solution3の場合-すべてのプロジェクト-定義は追加されていません

このアプローチでは、ソリューション全体を定義したすべてのソリューションを個別のディレクトリに保存する必要があります

10

ソリューション全体 #defineを作成する方法はないと思います。他の回答で説明したように、プロジェクト/アセンブリごとに1つ作成できますが、必要な場合は、ソリューションの各プロジェクトごとにこれを行う必要がありますallソースコードファイル#define。

4
Justin

もう1つの回避策があります。間違っている場合は修正してください。

たとえば、ProjectAProjectBを参照し、ProjectsCommonはベース静的変数を含みます。両方のプロジェクトがProjectsCommonを参照します。

ProjectsCommonのコード:

[Assembly: InternalsVisibleTo("ProjectA")]

------------------------------------------

public class ConditionVariables
{
    public static bool IsABC { get; internal set; } = false;
}

ProjectAのコード:

#if ABC
    ProjectsCommon.ConditionVariables.IsABC = true;
#endif

ProjectBのコード:

if (ProjectsCommon.ConditionVariables.IsABC )
{
    // first scenario
}
else
{
    // second one
}

ただし、ProjectAのコードを最初に実行する必要があります。これはおそらく、ProjectAがbootstarapperプロジェクトである場合に適しています。

1
Andrey K.

vs 2013では、/ define:xまたは/ d:xを使用できます http://msdn.Microsoft.com/en-us/library/0feaad6z.aspx

1
Bas Smit

ソリューション全体の定義はわかりませんが、次の方法ですべてのプロジェクトにプリプロセッサ定義をすばやく追加できました。

  1. ctrlキーを押しながら各プロジェクトを選択します
  2. 選択したプロジェクトを右クリックして、Propertiesを選択します
  3. C/C++に移動します-> Preprocessor
  4. Preprocessor Definitionsの横にある小さな下矢印をクリックします
  5. <Edit...>を選択します
  6. <different options>の後に定義を追加します
  7. メニューからOK

CコードベースでVisual Studio Community 2019を使用しています。

0
Samuel

数年後、アレクセイの答えに似ていますが、本質的にサポートされています

Directory.Build.propsに似たNuGet.Configファイルを作成できます

https://docs.Microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

私たちのように見えます:

<Project>
    <PropertyGroup>
        <DefineConstants>RC_427</DefineConstants>
    </PropertyGroup>
</Project>

そして、SLNのすべてのCSPROJファイルにこれを効果的に含めます。何らかの理由で、その特定の解決策をグーグル経由で見つけるのは非常に困難です。 MSBuild 15以降に使用されています

0
Malachi

Configuration Managerで新しいソリューション構成を作成し、ボックスがチェックされていることを確認して、新しいプロジェクト構成も作成します。そして、各プロジェクトのビルドプロパティで、条件付きコンパイルシンボルボックスにMONOと入力します。

0
Mark Cidade