从 VSIX 扩展中获取 vcxproj AdditionalOptions 字段

Obtaining the vcxproj AdditionalOptions field from within a VSIX extension

我有一个 Visual Studio 扩展,它需要对 其他选项 字段的读取权限,该字段位于 [=37] 下的 Visual C++ 项目的配置属性中=]++ 编译器。 从 Visual Studio 2015-2019 扩展中获取此字段的现代方法是什么?


我似乎无法使用 EnvDTE,因为枚举的 VS2019 C++ 项目无法转换为 VCProject,这反过来又阻止我检索 VCCLCompilerTool.AdditionalOptions.

我可以使用 IVsBuildPropertyStorage 接口提取一些其他属性:

IVsBuildPropertyStorage buildPropertyStorage = hierarchyProject as IVsBuildPropertyStorage;
buildPropertyStorage.GetPropertyValue("IntermediateOutputPath", configName, (uint)_PersistStorageType.PST_USER_FILE, out additionalOptions);

但这会为附加选项生成一个空字符串。我怀疑所说的 属性 根本不是 属性,因为它不在 PropertyGroup 容器内,而是在 vcxproj 中的 ClCompile 节点下,因此它可能必须被不同地查询。

我还尝试使用作为 Microsoft.Build.Construction 命名空间的一部分公开的功能浏览项目文件,但这与在 Xml 解析器中打开项目一样好。似乎没有一种简单的方法来评估文档中的条件,这使得这种方法不可靠。

我可以在 Microsoft.VisualStudio.Workspace.Extensions 命名空间中使用一些潜在的功能,但它在 VS2015 中不可用。


理想情况下,我想避免使用已弃用的 API。目前看起来没有对 ClCompiler 属性的适当支持。

我浏览了 Microsoft .NET API 文档并发现了 Microsoft.Build.Evaluation.Project class,它有助于访问评估的道具和项目。因此,实现我想要的目标的一种方法是以下列方式遍历该对象:

Project project = ProjectCollection.GlobalProjectCollection.LoadProject(projectPath);
var evaluatedMetadataNode = project.AllEvaluatedItemDefinitionMetadata.FirstOrDefault
    (item => item.ItemType == "ClCompile" && item.Name == "AdditionalOptions");
string additionalOptions = evaluatedMetadataNode.EvaluatedValue;

但是,我很好奇是否有更好的解决方案,因为似乎没有一种简单的方法来指定应该用于评估的配置,这使得该解决方案不适合某些情况。

更新:我发现使用允许指定全局属性字典的项目构造函数允许特定于配置的评估。为此,您需要将 ConfigurationPlatform 属性及其值放入所述字典中:

IDictionary<string, string> props = new Dictionary<string, string>();
props["Configuration"] = "Release";
props["Platform"] = "x64";

Project project = new Project(pathToProject, props, null, new ProjectCollection());