向dotnet build传递自定义常量导致目标框架符号失效怎么办?
问题分析与解决方法
你遇到的问题核心在于:直接通过-p:DefineConstants=TEST_RUN设置编译常量时,覆盖了.NET SDK自动为目标框架生成的符号(比如NETCOREAPP2_2、NETCOREAPP3_0),而不是追加新的常量。
解决办法一:命令行追加常量
在命令行中,你需要借助$(DefineConstants)引用SDK默认定义的符号,再用分号分隔追加自定义符号,这样就能保留原有框架符号:
dotnet build --no-incremental -p:DefineConstants="$(DefineConstants);TEST_RUN"
编译完成后测试,就能得到预期结果:
PS>> dotnet .\bin\Debug\netcoreapp2.2\TargetFramework.dll Target framework: NETCOREAPP2_2 Test mode active! PS>> dotnet .\bin\Debug\netcoreapp3.0\TargetFramework.dll Target framework: NETCOREAPP3_0 Test mode active!
解决办法二:修改项目文件(更持久的方案)
如果不想每次编译都输入长命令,可以直接在项目文件中配置,让SDK自动合并框架符号和自定义符号:
修改后的项目文件:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netcoreapp3.0;netcoreapp2.2</TargetFrameworks> <OutputType>Exe</OutputType> <DefineConstants>$(DefineConstants);TEST_RUN</DefineConstants> </PropertyGroup> </Project>
之后直接运行dotnet build --no-incremental,就能同时保留框架符号和自定义符号。
问题根源
.NET SDK会根据你指定的TargetFramework自动将对应框架符号(如NETCOREAPP3_0)注入到DefineConstants属性中。当你直接赋值DefineConstants=TEST_RUN时,会完全替换掉SDK默认的属性值,导致框架符号丢失。而用$(DefineConstants);TEST_RUN的写法,是在原有值基础上追加新常量,自然就保留了框架符号。
内容的提问来源于stack exchange,提问作者ie.
相关产品推荐
相关产品推荐

