Получение поля AdditionalOptions vcxproj из расширения VSIX - PullRequest
0 голосов
/ 18 июня 2020

У меня есть расширение Visual Studio, которому требуется доступ для чтения к полю Дополнительные параметры , которое находится в свойствах конфигурации проекта Visual C ++ в компиляторе C / 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);

Но это возвращает пустую строку для Additional Параметры. Я подозреваю, что указанное свойство вообще не является свойством, поскольку оно не находится в контейнере PropertyGroup, а находится под узлом ClCompile в vcxproj, поэтому его, возможно, придется запросить по-другому.

Я также пробовал просматривать файл проекта, используя функции, представленные как часть пространства имен Microsoft.Build.Construction, но это так же хорошо, как открытие проекта в парсере Xml. Кажется, нет простого способа оценки условий в документе, который делает этот подход ненадежным.

Возможно, есть некоторые функции, которые я мог бы использовать в пространстве имен Microsoft.VisualStudio.Workspace.Extensions, но они недоступны в VS2015.


В идеале я бы не хотел использовать устаревшие API. На данный момент похоже, что нет надлежащей поддержки свойств ClCompiler.

1 Ответ

1 голос
/ 19 июня 2020

Я просмотрел документы API Microsoft. NET и наткнулся на класс Microsoft.Build.Evaluation.Project, который упрощает доступ к оцененным свойствам и элементам. Таким образом, один из способов добиться того, что я хочу, - это пройти этот объект следующим образом:

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

Однако мне любопытно, есть ли лучшее решение, потому что, похоже, нет простого способ указать конфигурацию, которая должна использоваться для оценки, что делает это решение неприемлемым для некоторых ситуаций.

Обновление : я обнаружил, что с помощью конструктора Project, который позволяет спецификацию глобального словаря свойств разрешает c оценок конфигурации. Для этого вам необходимо указать свойства Configuration и Platform с их значениями в указанном словаре:

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

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