В любом случае существует ли #define Constant
в базе решений Visual Studio?
Можно определить константу на основе csproject, и можно положить #define Constant
в файл cs, но мне интересно, можно ли определить ее на основе vs sln?
В любом случае существует ли #define Constant
в базе решений Visual Studio?
Можно определить константу на основе csproject, и можно положить #define Constant
в файл cs, но мне интересно, можно ли определить ее на основе vs sln?
Фактически вы можете использовать вариацию подхода 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/
У меня есть другой подход для этого:
Изменить глобальный файл конфигурации. Например, в моем случае это .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>
Косвенно существует. Если вы установите переменную среды с флагом и запустите 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. Я хочу, чтобы было лучшее решение, но я его не нашел.
Это возможно для проектов 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