2008-11-22 32 views
0

我將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++項目,構建將至少涉及一個子流程,因此取消該線程甚至不會真正取消構建。

我沒有看到引擎類的任何取消方法 - 有人知道一種方式嗎?

+0

hmmm .... TFS正在這樣做,如果你運行TFSBuild停止命令... :) – badbadboy 2008-11-22 23:26:40

+0

同意 - 顯然微軟知道如何做到這一點,但我一直無法弄清楚。 – Charlie 2008-11-23 03:57:05

回答

0

看來是沒有官方的方式來做到這一點。

對於C#構建它不是一個大問題,因爲它們通常非常快。我爲C++構建提出的最佳解決方法是找到由VC構建過程創建的子進程並終止它們,從而停止MSBuild構建。

CreateToolhelp32Snapshot(ToolHelp.SnapshotFlags.Process, 0); 

從這裏可以判斷進程之間的父/子關係,並找到多數民衆贊成調用的MSBuild的應用催生了過程:這可以通過使用Toolhelp32快照,這樣的事情(省略的P/Invoke垃圾)來完成。

0

我通過從命令運行msbuild做了類似的事情。這開始一個過程,你可以終止。

根據我的經驗,使用xml工具操作項目文件然後執行msbuild比按照您所描述的方式編程配置項目要容易和靈活。它也更易於管理。

+0

謝謝,但我需要一種方法通過嵌入式的MsBuild實例做到這一點。 – Charlie 2008-11-23 03:56:35

1

這個問題已經出現了幾次在MSDN板上,不幸的是我除了終止線程外沒有看到任何其他方式。可悲的是,在這種情況下,終止線程並不是真正的激烈,它是唯一真正的選擇。

在一個隨機的方面說明,我不確定你使用MSBuild的程度與目前你在做什麼。只是建議看看Codeplex上的MSBuild Extension Pack,如果你經常使用MSBuild。