Есть ли способ #define Constant на основе решения? - PullRequest
27 голосов
/ 11 марта 2011

Есть ли в любом случае #define Constant на основе решения Visual Studio?

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

Ответы [ 4 ]

19 голосов
/ 11 марта 2011

Вы можете использовать вариацию подхода 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/

12 голосов
/ 06 декабря 2011

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

  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>
    
6 голосов
/ 11 марта 2011

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

0 голосов
/ 12 июня 2019

Это возможно для проектов Unity.Создание файла с именем
mcs.rsp (для .Net 3.5 Equivalent) или
csc.rsp (для .Net 4.0 Equivalent)
в папке / Assets / позволяет вам сделать это.

Пример: /Assets/csc.rsp файл включает в себя:

-define:THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT
-define:ANOTHER_GLOBAL_PREPROCESSOR_CONSTANT

В проекте, в любом плеере или редакторе c # 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

Протестировано на Unity2019.1.2

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...