web-dev-qa-db-ja.com

とにかく、ソリューションベースで定数を#defineする方法はありますか?

Visual Studioソリューションベースで#define Constantする方法はありますか?

Csprojectベースで定数を定義でき、csファイルに#define constantを入れることができますが、vsslnベースで定義できるかどうか疑問に思います。

30
Graviton

実際には、一般的なプロジェクト設定でRitchのアプローチのバリエーションを使用できます。基本的に、ソリューション内の各プロジェクトファイルの末尾に1つの変更を加える必要があります。

  <PropertyGroup Condition="'$(SolutionDir)' == '' or
                     '$(SolutionDir)' == '*undefined*'">
      <SolutionDir>..\..\</SolutionDir>
    </PropertyGroup>
    <Import Project="$(SolutionDir)CommonSettings.targets" />
  </Project>

次に、CommonSettings.targetsを定義して、ソリューション全体の設定を含めることができます。

  <Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003"
           ToolsVersion="3.5">
      <PropertyGroup>
          <TacoBuild>true</TacoBuild>
      </PropertyGroup>
  </Project>

各プロジェクトですでに定義されているプロジェクト設定をオーバーライドまたはマージする場合を除いて、基本的にはこれで終わりです。以下のリンクでは、これを行う方法について詳しく説明しています。

http://www.ademiller.com/blogs/tech/2007/12/common-project-settings-for-your-visual-studio-solution/

19
Ade Miller

これを行うための別のアプローチがあります:

  1. グローバル設定ファイルを編集します。たとえば、私の場合は.netcf2.0なので、$(MSBuildBinPath)\Microsoft.compactframework.csharp.targetsです。

    次の行を追加します。

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

    これは、MSBuildにCommonSettings.targetsがソリューションフォルダーに存在するかどうかをインポートするように指示するためです。

  2. ソリューションフォルダーの下にCommonSettings.targetsを作成します。

    たとえば、ABCシンボルを定義するには:

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

間接的にあります。フラグを使用して環境変数を設定し、VSを実行する場合:

set TacoBuild=true
devenv.eve bigproject.sln

または、コマンドラインからMSBuildを起動します。

msbuild /p:TacoBuild=true

.csprojファイルで、PropertyGroupを追加する必要があります。

<PropertyGroup Condition="'$(TacoBuild)'=='true'">
    <DefineConstants>$(DefineConstants);TacoBuild</DefineConstants>
</PropertyGroup>

コードには、プリプロセッサdefが必要です。

#if TacoBuild 
    const int myConst = 42;
#endif

VSのみの代替手段は、新しいプロジェクト構成のビルド設定でプリプロセッサー定義を定義し、その構成をビルドで使用することです。

MSBuild以外のソリューションは、constants.csファイルを作成し、csファイルを更新するカスタム設定ツールを作成することです。より良い解決策があればいいのですが、見つかりませんでした。

6
Ritch Melton

MSBuild 15.0以降では、Directory.Build.propsを使用して、複数のプロジェクトの定数を定義できます。 https://docs.Microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

これはcsprojに似ていますが、子フォルダー内のすべてのcsprojに適用される値を定義します。

Directory.Build.propsという名前のファイルをフォルダーツリーの一番上に作成します(すべての子csprojに適用します)。

追加:

<Project>
 <PropertyGroup>
   <DefineConstants>MaConstante</DefineConstants>
 </PropertyGroup>
</Project>
0
laperouse

これはUnityプロジェクトで可能です。というファイルを作成する
mcs.rsp(.Net 3.5と同等のものを対象とする)または
csc.rsp(.Net 4.0と同等のものを対象とする)
/Assets /フォルダーで、それを行うことができます。

例:/Assets/csc.rspファイルには次のものが含まれます。

-define:THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT
-define:ANOTHER_GLOBAL_PREPROCESSOR_CONSTANT

プロジェクトでは、任意のプレーヤーまたはエディターのc#スクリプトで:

#if THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT
        Debug.Log("THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT is defined"); // compiles 
#else
        Debug.Log("THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT is not defined");
#endif

Unity2019.1.2でテスト済み

https://docs.unity3d.com/Manual/PlatformDependentCompilation.html

0
Levent Alpsal