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