我正在尝试以编程方式将导入任务添加到 .csproj 文件,但我不想使用 Microsoft.Build.BuildEngine 对象来执行此操作,因为 VS 会弹出有关正在修改的项目文件的警告从 Visual Studio 外部。
我已经看到几页 [1] [2] 表明 IVsBuildPropertyStorage 接口(interface)将允许我访问 .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
谢谢。对此我能得到任何建议,我将不胜感激。
最佳答案
我问了一个类似的问题,请看这里 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 个步骤完成此操作:
以下是伪代码:
- 使用 DTE.ActiveSolutionProjects 获取项目文件位置并获取每个项目的属性。获取 FullPath 和 FileName 以获取项目文件的完整路径。
获得项目文件的完整路径后,调用 ProjectRootElement.Open静态方法:
ProjectRootElement 项目 = ProjectRootElement.Open(projectPath);
获得 ProjectRootElement 引用后,您可以调用 AddImport方法(其中名称是项目标识符属性):
project.AddImport(name)
应该可以的。
关于visual-studio - 如何使用 IVsBuildPropertyStorage 添加 MSBuild 导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3160113/