将定义的常量传递给dotnet build会使目标框架符号丢失。

10
我创建了一个小应用程序,它针对两个框架(.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个回答

15

您想要将变量添加到,而不是设置它。

在项目文件中,您将使用:

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

从命令行中操作可能会很麻烦,因此您可以使用自己的ExtraDefineConstants属性(或任何您喜欢的名称):

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

然后您将其传递到命令行:dotnet build -p:ExtraDefineConstants=TEST_RUN


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接