如何使用IVsBuildPropertyStorage添加MSBuild导入?

3
我正在尝试以编程方式向.csproj文件添加导入任务,但我不想使用Microsoft.Build.BuildEngine对象来完成此操作,因为VS会弹出关于项目文件被从Visual Studio外部修改的警告。
我看到了一些页面[1] [2]建议我使用IVsBuildPropertyStorage接口来访问.csproj文件的MSBuild部分,但我很难弄清楚如何做到这一点,或者它是否真的可行。看起来我需要指定要访问的属性名称,但我不确定如何找出它。对于已经设置为我最终结果所需的项目文件,调用“Import”属性的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

谢谢。我希望能得到任何有关此事的建议。


也许有更简单的方法。为什么要修改你的.csproj文件?一个带条件的硬编码<Import />能否提供你所需的功能? - Filburt
我刚刚看到了你之前的帖子,解释了你想要什么。 - Filburt
是否有完整的源代码解决方案? - Kiquenet
2个回答

6
我曾问过一个类似的问题,可以在这里查看: Programmatically adding and editing the Targets in a Visual Studio Project File。您可以使用此命名空间http://msdn.microsoft.com/en-us/library/microsoft.build.construction.aspx来以编程方式向项目文件添加 import,该命名空间是来自程序集(在 GAC 中)Microsoft.Build.dll中的。你可以按照以下步骤实现:

以下是伪代码:

  1. 使用DTE.ActiveSolutionProjects获取项目文件位置并获取每个项目的属性。获取文件的完整路径和文件名以获取项目文件的完整路径。
  2. 一旦您拥有项目文件的完整路径,请调用ProjectRootElement.Open静态方法:

    ProjectRootElement project = ProjectRootElement.Open(projectPath);

  3. 当您拥有ProjectRootElement引用时,可以调用AddImport方法(其中name是项目标识符属性):

    project.AddImport(name)

就这样。

谢谢,我回到这个问题时会探索那个选项。 - Greg
1
这个解决方案的问题在于文件是在进程外修改的,因此Visual Studio会要求重新加载文件。 - Gael Fraiteur

2

Import元素不是MSBuild中的Property元素或Item元素。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接