Подтвердить что ты не робот

Есть ли способ #define Constant на основе решения?

В любом случае существует ли #define Constant в базе решений Visual Studio?

Можно определить константу на основе csproject, и можно положить #define Constant в файл cs, но мне интересно, можно ли определить ее на основе vs sln?

4b9b3361

Ответ 1

Фактически вы можете использовать вариацию подхода Ritch с общими настройками проекта. По существу, вы должны сделать одно изменение в конце каждого файла проекта в своем решении:

  <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/

Ответ 2

У меня есть другой подход для этого:

  • Изменить глобальный файл конфигурации. Например, в моем случае это .netcf2.0, поэтому он $(MSBuildBinPath)\microsoft.compactframework.csharp.targets.

    Добавьте следующую строку:

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

    Это означает, что MSBuild импортирует CommonSettings.targets, если он существует в папке вашего решения.

  • Создайте CommonSettings.targets в папке с вашим решением.

    Например, чтобы определить символ ABC:

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

Ответ 3

Косвенно существует. Если вы установите переменную среды с флагом и запустите 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. Я хочу, чтобы было лучшее решение, но я его не нашел.

Ответ 4

Это возможно для проектов 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

В проекте, в любом плеере или редакторе С# script:

#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

Проверено на Unity 2019.1.2

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