我将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类上看到任何取消方法 - 有人知道某种方式吗?
答案 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的应用程序生成的进程。