如何在 VisualStudio 中取消长时间运行的自定义构建工具的构建过程?

xMR*_*MRi 5 msbuild build visual-studio visual-studio-2015

我有一个自定义构建步骤。在这一步中,我有一个大型长时间运行的工具来将数据库转换为特殊的静态压缩格式。该工具处理近 2GB 的数据并运行 30 分钟。

这些工具处理 Ctrl+C 和 Ctrl+Break。从命令行运行时可以轻松停止。

但是在 VisualStudio 中(我目前使用的是 VS2015),我无法停止这个工具的运行。当我选择Build -> Cancel. 但我的工具继续运行。

看来 VS 不处理它启动的进程的中断信号。

在不使用任务管理器的情况下,是否有任何技巧或设置可以在构建过程中中止工具?

Ami*_*nen 2

当您取消构建时,编译器和链接器“知道”停止,因为它们作为 MSBuild Tool Task运行,并且对ToolCanceled事件敏感。虽然您无法使用自定义构建步骤执行相同的操作,但您可以使用扩展ToolTask
​​ 的类包装您的工具,并在触发 ToolCanceled事件时终止您的工具。

为此,您需要在 msbuild 项目文件中注册一个任务。这对于内联任务也是可能<Code Type="class" ...

ToolTask​​ 还实现了ICancelableTask,因此您可以重写Cancel()类中的方法并在调用工具时停止工具。
Cancel()取消构建时,MSBuild 将调用该方法。

以下是实现的内联任务的示例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>
Run Code Online (Sandbox Code Playgroud)