1

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

我看过几页 [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

谢谢。我会很感激我能得到的任何建议。

4

2 回答 2

5

我问了一个类似的问题,请参阅此处以编程方式添加和编辑 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 项目 = ProjectRootElement.Open(projectPath);

  3. 获得 ProjectRootElement 引用后,您可以调用AddImport方法(其中 name 是项目标识符属性):

    project.AddImport(名称)

那应该这样做。

于 2010-12-22T20:01:20.083 回答
1

Importelement 不是PropertyMSBuild 中的一个元素,也不是Item一个。

我认为您不能添加Importusing IVsBuildPropertyStorage

于 2010-07-02T06:44:59.487 回答