visual-studio - 如何使用 IVsBuildPropertyStorage 添加 MSBuild 导入?

标签 visual-studio msbuild msbuild-task

我正在尝试以编程方式将导入任务添加到 .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 个步骤完成此操作:

以下是伪代码:

  1. 使用 DTE.ActiveSolutionProjects 获取项目文件位置并获取每个项目的属性。获取 FullPath 和 FileName 以获取项目文件的完整路径。
  2. 获得项目文件的完整路径后,调用 ProjectRootElement.Open静态方法:

    ProjectRootElement 项目 = ProjectRootElement.Open(projectPath);

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

    project.AddImport(name)

应该可以的。

关于visual-studio - 如何使用 IVsBuildPropertyStorage 添加 MSBuild 导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3160113/

相关文章:

msbuild - 在 MSBuild 任务中覆盖 MSBuildExtensionsPath 是不稳定的

powershell - 在自定义 VSTS PowerShell 脚本任务中使用特殊字符

c++ - 如果使用多字节字符集,为什么 TCHAR 值会改变?

visual-studio - 有什么方法可以从命令行构建 Visual Studio "project only"?

c# - 如何重置 Visual Studio 以便它在调试时再次搜索 DLL 的源文件?

c - Windows cmake 找不到 memset 或其他标准函数

c# - MSBuild 自定义规则

azure - 通过 MSBuild 和 WebDeploy 部署 Azure 网站,但使用哪些凭据?

msbuild - 使用 msbuild 命令行在指定路径中发布网站

powershell - 自动 Web 部署到远程 IIS 服务器