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



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

我已经意识到我可以从项目属性中获取其中的一些(就像所有的 -I 和 -D(。但是有些是"不可见的",我意识到它们是编译器本身设置的宏。我找到了一个页面,列出了所有这些:https://learn.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 StudioxxxxxxCommon7IDEVCVCTargetsMicrosoft.Cpp.Common.props。这些宏是在那里定义的,我在 VS SDK 或 .net 框架中找不到任何可用于扩展它们的 api。

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

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

最新更新