首页 > 解决方案 > 列出为 C# 定义的预处理器符号

问题描述

运行dotnet,msbuildcsc时,我想输出定义的预处理器符号列表,类似于gcc -dM -E. 我怎样才能做到这一点?

标签: c#

解决方案


定义的预处理器符号列在名为DefineConstants. 要回显它们,您可以将目标添加到项目文件中,如下所示:

<Target Name="EchoDebugInfo" BeforeTargets="CoreCompile">
    <Message Importance="high" Text="Just before building, current compile defines are $(DefineConstants)"></Message>
</Target>

在我的测试运行中(dotnet build不使用额外参数),打印出来:

Just before building, current compile defines are TRACE;DEBUG;NETCOREAPP;NETCOREAPP2_2

请注意,如果您省略Importance="high",则消息的重要性默认为 "normal",不会在 的默认详细程度中显示dotnet build。设置Importance="high"允许我在不更改dotnet build命令的默认详细程度的情况下获得输出。

顺便说一句,如果您尝试按照Visual Studio 文档BeforeBuild中的建议定义目标,您会发现如果您使用的是新的 .Net Core 样式项目(例如, ),它不起作用。这是因为 SDK 项目是在您的项目文件之后自动导入的,因此您会在构建日志中看到类似于此消息的内容:<Project Sdk="Microsoft.NET.Sdk">

用项目“/usr/share/dotnet/sdk/3.0.100/Microsoft.Common.CurrentVersion”中的目标“BeforeBuild”覆盖项目“/home/rmunn/path/to/project/Project.fsproj”中的目标“BeforeBuild”。目标”。

然后你的BeforeBuild目标不起作用。MSDN docs 中有一条注释解释了这一点(强调原文):

SDK 风格的项目在项目文件的最后一行之后隐式导入了目标。这意味着您无法覆盖默认目标,除非您按照如何:使用 MSBuild 项目 SDK中所述手动指定导入。

如果您需要完全控制何时导入 SDK 项目,那么这就是要走的路。但是对于这个简单的用例,我更喜欢定义自己的目标并使用BeforeTargets="CoreCompile"它来将其放置在构建顺序中的正确位置。


推荐阅读