Visual Studio: 如何以编程方式获取编译器预定义的宏值?

Visual Studio: How to get the compiler predefined macros values programmatically?

我正在用 C# 编写 Visual Studio 扩展,我需要以编程方式捕获用户运行构建时编译器设置的所有选项。

我意识到我可以从项目属性中获得其中的一些(比如所有的 -I 和 -D)。但是有些是 "invisible" ,我意识到它们是编译器自己设置的宏。我在 https://docs.microsoft.com/fr-fr/cpp/preprocessor/predefined-macros?view=vs-2019 找到了列出所有这些的页面。

我可以找到很多我要找的:__cplusplus、_MSVC_LANG、_MSC_VER、_CPPRTTI、_MSC_FULL_VER、_MSC_EXTENSIONS 等.

我正在寻找 (C#) API 允许以编程方式获取所有这些宏值,以便我的 VS 扩展可以获取它们并将它们注入我的进程。

感谢您的帮助!

我知道获取宏扩展值的正常方法是使用 MSBuild 知识。

选择任何C++项目,将此脚本添加到xx.vcxproj中,我们可以在输出日志中获取详细信息:

  <Target Name="GetExpandedValue" AfterTargets="build">
    <Message Text="VS_IncludePath = $(VC_IncludePath)" Importance="high" />
    <Message Text="WindowsSDK_IncludePath = $(WindowsSDK_IncludePath)" Importance="high" />
  </Target>

但是很难从 VS SDK 中得到任何 api 的扩展值。这些宏在 msbuild props 文件中定义:C:\Program Files (x86)\Microsoft Visual Studio\xxx\xxx\Common7\IDE\VC\VCTargets\Microsoft.Cpp.Common.props。这些宏在那里定义,我在 VS SDK 或 .net 框架中找不到任何 api 可用于扩展它们。

我只能想象像 this 这样的可能方法,以编程方式调用 msbuild.exe 以使用上面的脚本构建一个 xx.csproj 文件,并获取输出记录器。然后解析它以从日志中获取我们需要的有用信息。这将是一项艰巨的任务...

所以如果你对扩展值没有特殊需求,我建议你在你的机器上获取值,并将值插入到你的扩展代码中。 (据我所知,如果我们使用具有相似工作负载的相同 VS 版本,那些唯一宏的值是相同的。)