c# - 列出为 C# 定义的预处理器符号
问题描述
运行dotnet
,msbuild
或csc
时,我想输出定义的预处理器符号列表,类似于gcc -dM -E
. 我怎样才能做到这一点?
解决方案
定义的预处理器符号列在名为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"
它来将其放置在构建顺序中的正确位置。
推荐阅读
- c# - 在多用户 Windows 虚拟机上的 WinForm 应用程序上使用 Ballon 提示
- hashmap - 为什么一个对象不能有一个与之关联的数组位置而不是使用哈希图?
- c++ - 在 C++ 中出现奇怪的“未解析的外部符号”错误
- amazon-web-services - 使用 AWS_IAM 授权方法和自定义域连接到 AWS API Gateway WebSockets API
- ios - PageTabViewStyle 从右到左
- html - 半透明元素总是出现在 Chrome 的顶部
- javascript - 为什么我的背景视频没有改变?
- angular - 如何使用primeng表在Angular中选择多行?
- email - 如何向 Gmail 发送“已读”消息?
- java - 如何在 Android 上同时启用前置和后置摄像头