【问题标题】:How to programmatically cancel an embedded MsBuild build如何以编程方式取消嵌入式 MsBuild 构建
【发布时间】:2008-11-22 22:27:48
【问题描述】:

我将 MSBuild 直接嵌入到更复杂的构建工具中。相关代码大致如下:

// assume 'using Microsoft.Build.BuildEngine;'
Engine e = Engine();
BuildPropertyGroup props = new BuildPropertyGroup();
props.SetProperty( "Configuration", Config.BuildConfig );
e.BuildProjectFile( projectFile, new string[] { "Build" }, props )

我的问题是如何在启动后取消此构建,而无需执行诸如终止线程之类的激烈操作。此外,如果正在构建的项目是 C++ 项目,则构建将涉及至少一个子进程,因此取消线程甚至不会真正取消构建。

我在 Engine 类上没有看到任何取消方法 - 有人知道方法吗?

【问题讨论】:

  • hmmm....如果您运行 TFSBuild 停止命令,TFS 会以某种方式做到这一点...:)
  • 同意 - 显然微软知道如何做到这一点,但我无法弄清楚。

标签: visual-studio msbuild


【解决方案1】:

这个问题在 MSDN 板上已经出现过几次,不幸的是,除了终止线程之外,我还没有看到任何其他方法。可悲的是,在这种情况下,终止线程并不是很激烈,因为它是唯一真正的选择。

顺便说一句,我不确定您在多大程度上使用 MSBuild 和您目前正在做的事情。如果您经常使用 MSBuild,只是想建议您查看 Codeplex 上的 MSBuild Extension Pack

【讨论】:

  • 我花了一些时间在反射器中查看这个,我认为你是正确的,它不能完成。对于 C# 程序来说,这不是什么大问题,但我将研究尝试直接杀死 VC 构建的子进程。
【解决方案2】:

我通过从命令运行 msbuild 做了类似的事情。这将启动一个您可以终止的进程。

根据我的经验,使用 xml 工具操作项目文件然后执行 msbuild 比按照您描述的方式以编程方式配置项目要容易和灵活得多。它也更易于管理。

【讨论】:

  • 谢谢,但我需要一种通过嵌入式 MsBuild 实例执行此操作的方法。
【解决方案3】:

似乎没有官方的方法可以做到这一点。

对于 C# 构建来说,这并不是什么大问题,因为它们通常非常快。我为 C++ 构建提出的最佳解决方法是找到由 VC 构建过程创建的子进程并终止它们,从而停止 MSBuild 构建。这可以使用 Toolhelp32 快照来完成,如下所示(省略 P/Invoke 垃圾):

CreateToolhelp32Snapshot( ToolHelp.SnapshotFlags.Process, 0 );

您可以在此处确定进程之间的父/子关系,并找到由调用 MSBuild 的应用生成的进程。

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 2012-09-21
    • 2010-09-10
    • 2012-08-03
    • 2015-11-16
    • 2011-11-08
    • 2018-09-07
    • 2012-05-05
    • 1970-01-01
    相关资源
    最近更新 更多