如何使用IVsBuildPropertyStorage添加MSBuild导入?

时间:2010-07-01 17:17:27

标签: visual-studio msbuild msbuild-task

我正在尝试以编程方式将导入任务添加到.csproj文件中,但我不想使用Microsoft.Build.BuildEngine对象来执行此操作,因为VS会弹出有关正在修改的项目文件的警告来自Visual Studio之外。

我已经看过几页[1] [2]建议IVsBuildPropertyStorage接口让我访问.csproj文件的MSBuild部分,但我无法弄清楚如何做到这一点,或者如果它是甚至可能真的。看起来我需要指定我想要访问的属性的名称,但我不知道如何解决这个问题。为“导入”属性调用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 个答案:

答案 0 :(得分:5)

我问了一个类似的问题,请参阅此处Programmatically adding and editing the Targets in a Visual Studio Project File如果以编程方式向项目文件添加导入,您可以使用此命名空间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方法(其中name是项目标识符属性):

    project.AddImport(名称)

  4. 应该这样做。

答案 1 :(得分:1)

Import元素不是MSBuild中的Property元素,也不是Item元素。

我认为您无法使用Import添加IVsBuildPropertyStorage