簡體   English   中英

如何在 VisualStudio 中取消長時間運行的自定義構建工具的構建過程?

[英]How to cancel build process in VisualStudio for a long running custom build tool?

我有一個自定義構建步驟。 在這一步中,我有一個大型長時間運行的工具來將數據庫轉換為特殊的靜態壓縮格式。 該工具處理近 2GB 的數據並運行 30 分鍾。

這些工具處理 Ctrl+C 和 Ctrl+Break。 從命令行運行時可以輕松停止。

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

看來 VS 不處理它啟動的進程的中斷信號。

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

編譯器和鏈接器“知道”在您取消構建時停止,因為它們作為 MSBuild Tool Task運行,並且對ToolCanceled事件敏感。
雖然您不能用自定義構建步驟做同樣的事情,但您可以用一個擴展ToolTask的類包裝您的工具,並在觸發ToolCanceled事件時終止您的工具。

為此,您需要在 msbuild 項目文件中注冊一個任務 這對於帶有<Code Type="class" ... 內聯任務也是可能的<Code Type="class" ...

ToolTask還實現了ICancelableTask,因此您可以覆蓋類中的Cancel()方法並在調用時停止您的工具。
當構建被取消時,MSBuild 將調用Cancel()方法。

下面是一個實現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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM