編譯器和鏈接器「知道」在取消構建時停止,因爲它們以MSBuild Tool Task運行,並且對ToolCanceled事件敏感。
儘管您無法使用自定義構建步驟做同樣的事情,但您可以使用擴展ToolTask的類來包裝工具,並在觸發ToolCanceled事件時終止工具。
要做到這一點,您需要在您的msbuild項目文件中使用register a task。這也是可能的inline tasks與<Code Type="class" ...
ToolTask還實現ICancelableTask這樣你就可以覆蓋類Cancel()
方法被調用時停止你的工具。
Cancel()
當構建被取消時,方法將由MSBuild調用。
這裏是一個實現inline task的示例Cancel()
:
<UsingTask TaskName="MyTool" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<!-- Tool parameters -->
</ParameterGroup>
<Task>
<Code Type="Class" Language="cs">
<![CDATA[
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using System;
public class MyTool : Task, ICancelableTask
{
public override bool Execute()
{
Log.LogMessage(MessageImportance.High, "MyTool: Build started!");
// Code to run your tool...
}
public void Cancel()
{
Log.LogMessage(MessageImportance.High, "MyTool: Build cancelled!");
// Code to stop your tool...
}
}
]]>
</Code>
</Task>
</UsingTask>
它看起來像這樣的行爲是「[由設計](https://connect.microsoft.com/VisualStudio/Feedback/details/780267 )」。如果您控制工具的來源,可能的解決方法是:添加一個參數「/ cancel」,它設置一個事件並立即返回。在轉換例程中定期檢查是否設置了事件,如果是,則優雅地退出程序。在VS中,將外部工具添加到「Extras」菜單中,用參數「/ cancel」調用您的工具。您必須手動調用此菜單項,但仍比使用任務管理器更好。 – zett42
我剛剛發現這個[Visual Studio擴展](https://marketplace.visualstudio.com/items?itemName=DenisKuzminreg.vsSolutionBuildEvent-11615),它允許您在「Cancel-Build」事件中運行工具或腳本。從我們之前的評論中可以看出,你可以用「/ cancel」參數來調用你的工具。 – zett42