【问题标题】:How to use custom preprocessor directives in .Net Core如何在 .Net Core 中使用自定义预处理器指令
【发布时间】:2017-05-02 17:22:42
【问题描述】:

我正在尝试在 .Net 核心中使用预处理器指令,但我无法确定设置指令的正确方法:

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

我已尝试从命令行进行各种排列以使其正常工作,但我似乎遗漏了一些东西。这是我运行各种构建和运行命令时的 shell 输出:

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

我根据dotnet --version使用的是1.0.1版工具

有谁知道如何使用 .net core 从命令行正确设置指令?

【问题讨论】:

    标签: c# .net-core


    【解决方案1】:

    您需要设置的是/p:DefineConstants=MAC,注意这将覆盖项目中设置的常量,如DEBUGTRACE,您可能会设置这些常量,因此您可能使用的完整版本是

    用于调试构建

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

    对于发布版本

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

    一个更简单的解决方案是创建一个名为 Mac 的配置,并在您的 csproj 中有

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

    然后从命令行你只需要做

    dotnet msbuild /p:Configuration=Mac
    

    【讨论】:

    • 嗯.. DefineConstants 似乎没有帮助。此外,当我在值中输入多个时,我收到一条错误消息,指出 MSB1006 该属性无效。
    • 好的,我发现它不喜欢常量周围的引号。如果我不使用引号,则 DefineConstants 有效。
    【解决方案2】:

    如果您想要不影响其他设置的自定义配置开关(“配置”,如调试/发布),您可以定义任何其他属性并在您的构建中使用它。

    例如对于dotnet build /p:IsMac=true,您可以将以下内容添加到您的csproj 文件中(不是run 可能无法正确传递该属性,尽管IsMac=true dotnet run 将在清理后工作):

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

    如果您想更进一步并自动检测您是否 Mac 上构建,您可以使用 msbuild 属性函数来评估您正在构建的操作系统。并不是说这目前仅适用于 msbuild (dotnet msbuild) 的 .net 核心变体。有关支持的详细信息,请参阅this PR

    <PropertyGroup>
      <IsMac>$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::get_OSX())))</IsMac>
      <DefineConstants Condition=" '$(IsMac)' == 'true' ">$(DefineConstants);MAC</DefineConstants>
    </PropertyGroup>
    

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 2011-05-12
      • 2020-01-22
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多