将定义常量传递给 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 会杀死目标框架符号的主要内容,如果未能解决你的问题,请参考以下文章