Mar*_*ell 20

阅读文档,Launch如果附加了调试器,它听起来没有任何作用 - 它实际上并没有破坏(虽然我没有验证这一点).

Break 要求启动调试器(如果没有附加),并确实执行了中断.

实际上,你不可能有一个以上的Launch点......如果那样的话.


Han*_*ant 16

当一个可用时,启动将启动调试器.但如果没有可用的话,就会被忽略.如果没有可用的调试器,Break将使程序崩溃.


Mik*_*e S 8

更微妙的差异:

  1. 如果已经附加了调试器,则Debugger.Launch是一个nop ; 而 Debugger.Break总会闯入调试器.

  2. 启动调试器实际上并没有进入调试器.例如,在Visual Studio中,Debugger.Launch将调试器附加到正在运行的进程,但是您仍然需要执行Debug | 在Visual Studio中打破以实际打破调试器.


Osk*_*kar 5

我不确定是否有人真正尝试过 .NET Framework 和 .NET 5 之间有什么区别或者是否不同,但这是我测试时的行为:

运行示例时的结果

单击“确定”后,VS 将继续运行Debugger.Launch()(尽管其他回答者说不会):

在此输入图像描述

但是,如果调试器已经连接,则不会中断。Debugger.Launch()

如果我将我的项目打包为 dotnet 工具,一切都是一样的,只是它不知道在哪里中断:

在此输入图像描述

TL;DR:在 .NET 5 中:

附加调试器:

  • .Launch()不会做任何事
  • .Break()会打破

没有附加调试器:

  • .Launch()会要求附加一个调试器,如果你这样做,它将在以下位置中断.Launch()
  • .Break()不会做任何事(无一例外)

示例.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

程序.cs:

using System;
using System.Diagnostics;

Console.WriteLine("Before break");

Debugger.Break();

Console.WriteLine("After break");

Console.WriteLine("Before Launch");

Debugger.Launch();

Console.WriteLine("After Launch");
Run Code Online (Sandbox Code Playgroud)