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

2024-02-17

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

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

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

VS 似乎不会处理它启动的进程的中断信号。

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


当您取消构建时,编译器和链接器“知道”停止,因为它们作为 MSBuild 运行工具任务 https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.utilities.tooltask,并且对工具已取消 https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.utilities.tooltask.toolcanceled event.
虽然您无法使用自定义构建步骤执行相同的操作,但您可以使用扩展的类来包装您的工具ToolTask https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.utilities.tooltask并杀死你的工具工具已取消 https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.utilities.tooltask.toolcanceled事件被触发。

为此,您需要注册一个任务 https://learn.microsoft.com/sv-se/visualstudio/msbuild/task-writing在您的 msbuild 项目文件中。这也可以通过内联任务 https://learn.microsoft.com/sv-se/visualstudio/msbuild/msbuild-inline-tasks with <Code Type="class" ...

ToolTask https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.utilities.tooltask还实现了可取消任务 https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.framework.icancelabletask所以你可以覆盖Cancel()类中的方法并在调用它时停止您的工具。
Cancel()取消构建时,MSBuild 将调用该方法。

这是一个示例内联任务 https://learn.microsoft.com/sv-se/visualstudio/msbuild/msbuild-inline-tasks实现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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Visual Studio 中取消长时间运行的自定义构建工具的构建过程? 的相关文章

随机推荐