Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use custom preprocessor directives in .Net Core

Tags:

c#

.net-core

I am trying to use a preprocessor directive in .Net core, but I can't determine the correct way to get the directive to be set:

static void Main(string[] args) {     Console.WriteLine("Hello World!");     #if MAC     Console.WriteLine("MAC");     #else     Console.WriteLine("NOT MAC");     #endif } 

I have tried various permutations from the command line to get this to work, but I seem to be missing something. Here is the shell output when I run various build and run commands:

~/dev/Temp/DirectiveTests $ dotnet msbuild /p:MAC=TRUE Microsoft (R) Build Engine version 15.1.548.43366 Copyright (C) Microsoft Corporation. All rights reserved.    DirectiveTests -> /Users/me/dev/Temp/DirectiveTests/bin/Debug/netcoreapp1.1/DirectiveTests.dll ~/dev/Temp/DirectiveTests $ dotnet run /p:MAC=true Hello World! NOT MAC ~/dev/Temp/DirectiveTests $ dotnet run Hello World! NOT MAC 

I am using the tooling version 1.0.1 according to dotnet --version

Does anyone know how to properly set the directives from the command line using .net core?

like image 390
John Koerner Avatar asked May 02 '17 17:05

John Koerner


2 Answers

The thing you need to set is /p:DefineConstants=MAC note this will override constants set in the project like DEBUG or TRACE that may be set so the full version you would likely use would be

for a debug build

dotnet msbuild /p:DefineConstants=TRACE;DEBUG;NETCOREAPP1_1;MAC /p:Configuration=Debug 

and for a release build

dotnet msbuild /p:DefineConstants=TRACE;NETCOREAPP1_1;MAC /p:Configuration=Release 

An easier solution would create a configuration called Mac and in your csproj have

  <PropertyGroup Condition="'$(Configuration)'=='Mac'">     <DefineConstants>TRACE;NETCOREAPP1_1;MAC</DefineConstants>   </PropertyGroup> 

Then from the command line you just need to do

dotnet msbuild /p:Configuration=Mac 
like image 116
Scott Chamberlain Avatar answered Oct 05 '22 11:10

Scott Chamberlain


If you want custom configuration switches that do not impact other settings ("Configurations" like Debug/Release), you can define any other property and use it in your build.

E.g. for dotnet build /p:IsMac=true you could add the following to your csproj file (not that run might not pass the property correctly though IsMac=true dotnet run will work after a clean):

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

If you want to go further and automatically detect if you are building on a mac, you can use msbuild property functions to evaluate which OS you are building on. Not that this currently only works for the .net core variant of msbuild (dotnet msbuild). See this PR for details on the support.

<PropertyGroup>   <IsMac>$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::get_OSX())))</IsMac>   <DefineConstants Condition=" '$(IsMac)' == 'true' ">$(DefineConstants);MAC</DefineConstants> </PropertyGroup> 
like image 40
Martin Ullrich Avatar answered Oct 05 '22 11:10

Martin Ullrich