我正在尝试调试我刚刚创建的 MSBuild Customtask,但由于某种原因它永远不会在断点处停止。我什至尝试过这个:
public override bool Execute()
{
System.Diagnostics.Debugger.Break();
并在那一行添加了一个断点...我什至消除了该方法中的所有其他代码,但这没有改变任何东西。
为了能够调试 MSBuild 自定义任务的创建,有什么特殊要求吗?
这有点麻烦,但你总是可以将这行代码放在你想要开始调试的任何地方:
System.Diagnostics.Debugger.Launch();
当您调用它时,CLR 将启动一个对话框,询问您要附加哪个调试器。
这就是我所做的...在“调试”选项卡上的“项目属性”对话框中选择“启动外部应用程序” - 将 C:\WINDOWS\Microsoft.NET\Framework 2.0.50727\MSBuild.exe 放入框中..
然后在命令行参数中,输入你的参数 /Target:Whatever test.proj
在您的自定义任务中放置代码停止并启动应用程序..
您可以设置环境变量
MSBUILDDEBUGONSTART=1
,使MSBuild.exe
提示在应用程序启动时启动调试器。
然后,您可以选择用于开发任务的 Visual Studio 实例作为调试器,并在任务代码中设置断点。
这通常比修改任务来调用
Debugger.Launch()
更困难一些,但它可以在发布版本上使用并且无需修改任务,这可能很有用。
这里有一个主要警告:当您使用
-m
进行构建时,MSBuild 将启动多个进程,并且 每个进程 都会提示附加调试器。尝试使用 -m:1
进行构建或在执行此操作时构建单个项目,这样您就不会意外生成数十个想要调试的进程。
为了调试自定义任务,您需要将调试器附加到 MSBuild(或 dotnet build)进程。
我发现一篇文章解释了为什么
System.Diagnostics.Debugger.Launch();
不起作用。
您可以采取的解决方法是使用
SpinWait.SpinUntil(() => Debugger.IsAttached);
当您构建使用自定义任务的项目时,只有附加了调试器才会继续构建。此时,您的断点将能够被命中,您可以单步执行任务。
我从这篇文章中找到了这一点:实现和调试自定义 MSBuild 任务
向作者致以崇高的敬意;因为这让我卡住了很长一段时间。