#defineをグローバルに宣言する方法はありますか?
例えば、私が持っているファイルを持ちたいように、
#define MONO
そして、このプリプロセッサディレクティブが定義されていることをすべてのソースコードファイルに知らせる必要があります。どうすればそれを達成できますか?
更新:「ソリューション全体」の定義を行うことはできませんが、以下の回答はプロジェクトごとに実行できます。
コンパイルプロパティまたはビルドオプションで設定します。
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)
「カスタム定数を設定するには」の見出しを参照してください。
更新
プロジェクトを右クリックして、メニューからプロパティを選択すると、ビルドオプションが表示されます。
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の場合-すべてのプロジェクト-定義は追加されていません
このアプローチでは、ソリューション全体を定義したすべてのソリューションを個別のディレクトリに保存する必要があります
ソリューション全体 #defineを作成する方法はないと思います。他の回答で説明したように、プロジェクト/アセンブリごとに1つ作成できますが、必要な場合は、ソリューションの各プロジェクトごとにこれを行う必要がありますallソースコードファイル#define。
もう1つの回避策があります。間違っている場合は修正してください。
たとえば、ProjectA
はProjectB
を参照し、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プロジェクトである場合に適しています。
vs 2013では、/ define:xまたは/ d:xを使用できます http://msdn.Microsoft.com/en-us/library/0feaad6z.aspx
ソリューション全体の定義はわかりませんが、次の方法ですべてのプロジェクトにプリプロセッサ定義をすばやく追加できました。
Properties
を選択しますC/C++
に移動します-> Preprocessor
Preprocessor Definitions
の横にある小さな下矢印をクリックします<Edit...>
を選択します<different options>
の後に定義を追加しますOK
CコードベースでVisual Studio Community 2019を使用しています。
数年後、アレクセイの答えに似ていますが、本質的にサポートされています
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以降に使用されています
Configuration Managerで新しいソリューション構成を作成し、ボックスがチェックされていることを確認して、新しいプロジェクト構成も作成します。そして、各プロジェクトのビルドプロパティで、条件付きコンパイルシンボルボックスにMONO
と入力します。