如何以编程方式取消嵌入的MsBuild构建

时间:2008-11-22 22:27:48

标签: visual-studio msbuild

我将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类上看到任何取消方法 - 有人知道某种方式吗?

3 个答案:

答案 0 :(得分:1)

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

在随机附注中,我不确定您在多大程度上使用MSBuild与您当前正在做的事情。如果您定期使用MSBuild,只是想建议您查看Codeplex上的MSBuild Extension Pack

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

似乎没有正式的方法来做到这一点。

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

CreateToolhelp32Snapshot( ToolHelp.SnapshotFlags.Process, 0 );

从这里,您可以确定进程之间的父/子关系,并找到由调用MSBuild的应用程序生成的进程。