2017-04-12 25 views
4

我有一個自定義生成步驟。在這一步中,我有一個很長的運行工具來將數據庫轉換成特殊的靜態壓縮格式。該工具可處理將近2GB的數據並運行30分鐘。如何取消VisualStudio中長時間運行的自定義構建工具的構建過程?

該工具處理Ctrl + C和Ctrl + Break。並且在從命令行運行時可以輕鬆停止。

但VisualStudio內部(我目前使用VS2015)我無法停止這個工具運行。當我選擇Build -> Cancel時,編譯器和鏈接器停止。但我的工具繼續運行。

它接縫VS不處理它啓動的進程的中斷信號。

是否有任何技巧或設置在構建過程中中止工具,而不使用任務管理器?

+1

它看起來像這樣的行爲是「[由設計](https://connect.microsoft.com/VisualStudio/Feedback/details/780267 )」。如果您控制工具的來源,可能的解決方法是:添加一個參數「/ cancel」,它設置一個事件並立即返回。在轉換例程中定期檢查是否設置了事件,如果是,則優雅地退出程序。在VS中,將外部工具添加到「Extras」菜單中,用參數「/ cancel」調用您的工具。您必須手動調用此菜單項,但仍比使用任務管理器更好。 – zett42

+1

我剛剛發現這個[Visual Studio擴展](https://marketplace.visualstudio.com/items?itemName=DenisKuzminreg.vsSolutionBuildEvent-11615),它允許您在「Cancel-Build」事件中運行工具或腳本。從我們之前的評論中可以看出,你可以用「/ cancel」參數來調用你的工具。 – zett42

回答

1

編譯器和鏈接器「知道」在取消構建時停止,因爲它們以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> 
相關問題