我有一个自定义构建步骤.在这一步中,我有一个很长的运行工具,可以将数据库转换为特殊的静态压缩格式.该工具可处理近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>