Как добавить импорт MSBuild с помощью IVsBuildPropertyStorage? - PullRequest
1 голос
/ 01 июля 2010

Я пытаюсь добавить задачу импорта в файл .csproj программным способом, но я не хочу использовать объекты Microsoft.Build.BuildEngine, чтобы сделать это, потому что VS тогда выдаст предупреждения об изменении файла проекта извне Visual Studio.

Я видел несколько страниц [1] [2], в которых предлагалось, что интерфейс IVsBuildPropertyStorage позволит мне получить доступ к частям MSBuild файла .csproj, но у меня возникают проблемы с выяснением, как это сделать, или даже возможно на самом деле. Похоже, мне нужно указать имя свойства, к которому я хочу получить доступ, но я не уверен, как это выяснить. Вызов GetPropertyValue () для свойства «Импорт» ничего не возвращает для файлов проекта, которые уже настроены так, как я хочу, чтобы мои окончательные результаты выглядели:

EnvDTE.Project proj = ...;
var sol = Package.GetGlobalService(typeof(VsSolution)) as IVsSolution;
IVsHierarchy hier;
sol.GetProjectOfUniqueName(p.UniqueName, out hier);
var storage = hier as IVsBuildPropertyStorage;
string val;
storage.GetPropertyValue("Import", String.Empty,
                         (uint)_PersistStorageType.PST_PROJECT_FILE, out val);
// val is null

[1] https://mpfproj.svn.codeplex.com/svn/9.0/Tests/UnitTests/ProjectTest.cs
[2] http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/e1983591-120a-4a2f-a910-e596dd625e68

Спасибо. Буду признателен за любые предложения, которые я могу получить с этим.

Ответы [ 2 ]

5 голосов
/ 22 декабря 2010

Я задал похожий вопрос, см. Здесь Программное добавление и редактирование целей в файле проекта Visual Studio Что вы можете сделать, чтобы программно добавить импорт в файл проекта, это использовать это пространство имен http://msdn.microsoft.com/en-us/library/microsoft.build.construction.aspx который из сборки (в GAC) Microsoft.Build.dll.Вы можете выполнить это примерно за 3-4 шага:

псевдокод:

  1. Получить местоположение файла проекта с помощью DTE.ActiveSolutionProjects и получить свойства каждого проекта.Получите FullPath и FileName, чтобы получить полный путь к файлу проекта.
  2. Получив полный путь к файлу проекта, вызовите статический метод ProjectRootElement.Open :

    ProjectRootElement project = ProjectRootElement.Open (projectPath);

  3. Если у вас есть ссылка ProjectRootElement, вы можете вызвать метод AddImport (где имяявляется атрибутом идентификатора проекта):

    project.AddImport (name)

Это должно сделать это.

1 голос
/ 02 июля 2010
Элемент

Import не является ни элементом Property в MSBuild, ни элементом Item.

Я думаю, вы не можете добавить Import, используя IVsBuildPropertyStorage.

...