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

时间:2017-04-12 08:59:24

标签: visual-studio visual-studio-2015 build msbuild

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

工具处理Ctrl + C和Ctrl + Break。从命令行运行时很容易停止。

但在VisualStudio(我目前使用的是VS2015)中,我无法停止此工具的运行。当我选择Build -> Cancel时,编译器和链接器会停止。但是我的工具继续运行。

它接缝VS没有处理它开始的进程的中断信号。

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

1 个答案:

答案 0 :(得分:1)

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

为此,您需要在msbuild项目文件中ToolCanceled。使用<Code Type="class" ...

register a task也可以实现此功能

inline tasks也会实施ToolTask,因此您可以覆盖班级中的Cancel()方法,并在调用时停止工具。
当构建被取消时,MSBuild将调用Cancel()方法。

以下是实施Cancel()的{​​{3}}示例:

 <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>