.net core 基于NuGet PackageReference定义C#预处理器符号

.net core 基于NuGet PackageReference定义C#预处理器符号,.net-core,msbuild,csproj,preprocessor-directive,.net Core,Msbuild,Csproj,Preprocessor Directive,如果(且仅当)NEWTONSOFT.Json NuGet包作为PackageReference添加到我的.NET核心应用程序中,我想定义一个符号NEWTONSOFT。我该怎么做 编辑:为了澄清,我想添加符号,如果存在引用。如果删除引用,则不应再定义符号-但不应手动添加/删除符号定义。大概是这样的: <Choose> <When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' "

如果(且仅当)NEWTONSOFT.Json NuGet包作为PackageReference添加到我的.NET核心应用程序中,我想定义一个符号
NEWTONSOFT
。我该怎么做

编辑:为了澄清,我想添加符号,如果存在引用。如果删除引用,则不应再定义符号-但不应手动添加/删除符号定义。大概是这样的:

<Choose>
    <When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' ">
        <PropertyGroup>
            <DefineConstants>HDN</DefineConstants>
        </PropertyGroup>
    </When>
</Choose>
<Target Name="AddPackageSpecificConstants" BeforeTargets="BeforeCompile">
  <PropertyGroup>
    <DefineConstants Condition="@(Reference->AnyHaveMetadataValue('NuGetPackageId','Newtonsoft.Json'))">$(DefineConstants);NEWTONSOFT_JSON</DefineConstants>
    <DefineConstants Condition="@(Reference->AnyHaveMetadataValue('NuGetPackageId','YamlDotNet '))">$(DefineConstants);YAML_DOT_NET</DefineConstants>
  </PropertyGroup>
</Target>

HDN

除非这不起作用。

您可以在
项目属性
调试
选项卡中添加
条件编译符号
,并使用如下Roslyn预处理器指令:

#if NEWTONSOFT && !JSON.NET
// Your Codes
#endif


基于Microsoft Docs,您没有任何适用于
Nuget
软件包的预处理器指令。

您可以在
项目属性的
调试
选项卡中添加
条件编译符号
,并使用如下Roslyn预处理器指令:

#if NEWTONSOFT && !JSON.NET
// Your Codes
#endif


基于Microsoft Docs,您没有任何适用于
Nuget
软件包的预处理器指令。

自动执行此类操作的一种方法是在csproj文件中包含一个目标,该目标将生成逻辑如下所示:

<Choose>
    <When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' ">
        <PropertyGroup>
            <DefineConstants>HDN</DefineConstants>
        </PropertyGroup>
    </When>
</Choose>
<Target Name="AddPackageSpecificConstants" BeforeTargets="BeforeCompile">
  <PropertyGroup>
    <DefineConstants Condition="@(Reference->AnyHaveMetadataValue('NuGetPackageId','Newtonsoft.Json'))">$(DefineConstants);NEWTONSOFT_JSON</DefineConstants>
    <DefineConstants Condition="@(Reference->AnyHaveMetadataValue('NuGetPackageId','YamlDotNet '))">$(DefineConstants);YAML_DOT_NET</DefineConstants>
  </PropertyGroup>
</Target>

美元(定义常量);NEWTONSOFT_JSON
美元(定义常量);YAML_DOT_NET
通过连接到构建过程,这可以检测您的代码是否有任何编译时引用(意味着包的API表面在您的C#代码中可用)到特定的NuGet包,即使它们只是传递性引用(例如,您引用了一个引用Newtonsoft.Json的库,以便您可以使用它)


通过执行定义,如
$(X)附加常量被添加到属性中,因此这将保留SDK根据目标框架或其他项目内容默认提供给您的任何内容。

自动执行此类操作的一种方法是在csproj文件中包含一个提供构建逻辑的目标,如下所示:

<Choose>
    <When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' ">
        <PropertyGroup>
            <DefineConstants>HDN</DefineConstants>
        </PropertyGroup>
    </When>
</Choose>
<Target Name="AddPackageSpecificConstants" BeforeTargets="BeforeCompile">
  <PropertyGroup>
    <DefineConstants Condition="@(Reference->AnyHaveMetadataValue('NuGetPackageId','Newtonsoft.Json'))">$(DefineConstants);NEWTONSOFT_JSON</DefineConstants>
    <DefineConstants Condition="@(Reference->AnyHaveMetadataValue('NuGetPackageId','YamlDotNet '))">$(DefineConstants);YAML_DOT_NET</DefineConstants>
  </PropertyGroup>
</Target>

美元(定义常量);NEWTONSOFT_JSON
美元(定义常量);YAML_DOT_NET
通过连接到构建过程,这可以检测您的代码是否有任何编译时引用(意味着包的API表面在您的C#代码中可用)到特定的NuGet包,即使它们只是传递性引用(例如,您引用了一个引用Newtonsoft.Json的库,以便您可以使用它)


通过执行定义,如
$(X)额外的常量被添加到属性中,因此这将保留SDK根据目标框架或其他项目内容默认提供给您的任何内容。

是的,对不起,我应该更清楚一些。当PackageReference出现时,我想“自动”添加它们。据我所知,对于
Nuget Packages
,没有“自动”的
预处理器指令。但是,我必须提到
Cake.Recipe
的一些选项。(例如,附加指令)。是的,对不起,我应该说得更清楚些。当PackageReference出现时,我想“自动”添加它们。据我所知,对于
Nuget Packages
,没有“自动”的
预处理器指令。但是,我必须提到
Cake.Recipe
的一些选项。(例如,附加指令)。抱歉耽搁了,回答得很好!抱歉耽搁了,回答得很好!