visual-studio – 如何取消VisualStudio中的构建过程以获得长期运行的自定义构建工具?

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

这些工具处理Ctrl C和Ctrl Break.从命令行运行时很容易停止.

但在VisualStudio内部(我目前使用VS2015)我无法阻止此工具运行.当我选择Build – >时,编译器和链接器停止.取消.但我的工具继续运行.

它接缝VS不处理它启动的进程的中断信号.

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

最佳答案 取消构建时,编译器和链接器“知道”停止,因为它们作为MSBuild
Tool Task运行,并且对
ToolCanceled事件敏感.

虽然您无法使用自定义构建步骤执行相同操作,但您可以使用扩展
ToolTask的类包装工具,并在触发
ToolCanceled事件时终止工具.

为此,您需要在msbuild项目文件中使用register a task.这也可以使用inline tasks< Code Type =“class”… ToolTask还实现了ICancelableTask,因此您可以覆盖类中的Cancel()方法并在调用时停止工具.
取消构建时,MSBuild将调用Cancel()方法.

以下是实现Cancel()的inline task的示例:

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