条件编译常量在 .net 核心多目标 sdk 样式项目中不起作用

And*_* K. 0 conditional-compilation csproj multitargeting visual-studio .net-core

以下是最初定义条件编译常量的方式(注意多目标):

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp2.0;net461</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' OR '$(TargetFramework)' == 'netstandard2.0'">
    <DefineConstants>NETCORE;</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(TargetFramework)' == 'net461'">
    <DefineConstants>NETFULL;</DefineConstants>
  </PropertyGroup>
  ...

</Project>
Run Code Online (Sandbox Code Playgroud)

当时NETCORE常量工作正常。

#if NETCORE
    // Works Fine! Not gray in VS; Compiler recognizes code!
    public string Abc { get; set; }   
#endif
Run Code Online (Sandbox Code Playgroud)

我正在处理我的代码,但当时我的程序集没有编译。


之后,我添加了额外的条件编译常量(不编辑以前的 -NETFULLNETCORE):

<PropertyGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0'">
    <DefineConstants>NETCOREONLY;</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

整体代码(程序集)仍未编译。

并删除了NETCOREONLY不需要的附加项,只留下以前的(NETCORENETFULL)。

整体代码(程序集)仍未编译。

问题是它NETCORE不再像以前那样工作了。

我正在切换到netcoreapp2.0平台,但代码

#if NETCORE
    // Problem; Stays gray in VS; 
    // Compiler does not understand that it shoud consume this code
    public string Abc { get; set; }   
#endif
Run Code Online (Sandbox Code Playgroud)

对编译器不可见。它在 VS 中保持灰色。好像不是netcoreapp2.0

以下声明

  <PropertyGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' OR '$(TargetFramework)' == 'netstandard2.0'">
    <DefineConstants>NETCORE;</DefineConstants>
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

应该为NETCORE持续工作netcoreapp2.0,但事实并非如此。

Mar*_*ich 5

确保您只附加到DefineConstants属性,而不是完全将其重置为新值:

<PropertyGroup Condition="'$(TargetFramework)' == 'netcoreapp2.0' OR '$(TargetFramework)' == 'netstandard2.0'">
  <DefineConstants>$(DefineConstants);NETCORE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'netcoreapp2.0'">
  <DefineConstants>$(DefineConstants);NETCOREONLY</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)