将定义常量传递给 dotnet build 会杀死目标框架符号

Posted

技术标签:

【中文标题】将定义常量传递给 dotnet build 会杀死目标框架符号【英文标题】:Passing define constants to dotnet build kills target framework symbols 【发布时间】:2019-12-09 13:23:56 【问题描述】:

我创建了一个针对两个框架(.net core 2.2 和 .net core 3.0)并使用目标框架符号(NETCOREAPP2_2 和 NETCOREAPP3_0)的小型应用程序。

项目文件很简单,看起来是这样的:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp3.0;netcoreapp2.2</TargetFrameworks>
    <OutputType>Exe</OutputType>
  </PropertyGroup>
</Project>

程序代码可能并不简单:

public class MyClass

    static void Main()
    
#if NETCOREAPP3_0
        System.Console.WriteLine("Target framework: NETCOREAPP3_0");
#elif NETCOREAPP2_2  
        System.Console.WriteLine("Target framework: NETCOREAPP2_2");
#else
        System.Console.WriteLine("Target framework: WHO KNOWS?!");
#endif

#if TEST_RUN
        System.Console.WriteLine("Test mode active!");
#endif
    

如果我使用常规的 dotnet build --no-incremental 命令构建它而不使用其他参数,则两个版本都会创建并按预期工作:

PS>> dotnet .\bin\Debug\netcoreapp2.2\TargetFramework.dll
Target framework: NETCOREAPP2_2
PS>> dotnet .\bin\Debug\netcoreapp3.0\TargetFramework.dll
Target framework: NETCOREAPP3_0

在我的场景中,我需要使用额外的编译符号TEST_RUN 来构建这两个版本。所以我在构建命令dotnet build --no-incremental -p:DefineConstants=TEST_RUN 中添加了附加参数。结果,我有一个不知道目标框架的应用程序:

PS>> dotnet .\bin\Debug\netcoreapp2.2\TargetFramework.dll
Target framework: WHO KNOWS?!
Test mode active!
PS>> dotnet .\bin\Debug\netcoreapp3.0\TargetFramework.dll
Target framework: WHO KNOWS?!
Test mode active!

我需要为目标框架保留预处理器符号,但我不知道该怎么做。有任何想法吗?

【问题讨论】:

【参考方案1】:

你想添加到变量,而不是设置它。

在您将使用的项目文件中

  <PropertyGroup>
    <DefineConstants>$(DefineConstants);TEST_RUN</DefineConstants>
  </PropertyGroup>

这在命令行中可能很笨拙,因此您可以使用自己的 ExtraDefineConstants 属性(或您喜欢的任何名称):

  <PropertyGroup>
    <DefineConstants Condition=" '$(ExtraDefineConstants)' != '' ">$(DefineConstants);$(ExtraDefineConstants)</DefineConstants>
  </PropertyGroup>

然后你在命令行上传递它:dotnet build -p:ExtraDefineConstants=TEST_RUN

【讨论】:

以上是关于将定义常量传递给 dotnet build 会杀死目标框架符号的主要内容,如果未能解决你的问题,请参考以下文章

检查传递给方法的参数是不是是类中定义的常量之一?

杀死父进程后将标准输入传递给子进程

将宏传递给 nmake

autotools:将常量从 configure.ac 传递给 python 脚本

将数组常量传递给枚举构造函数[重复]

如何将视图模型外部的常量传递给 Knockout 绑定?