C# 当遇到断点时,如何防止Windows.NET中的代码运行?

C# 当遇到断点时,如何防止Windows.NET中的代码运行?,c#,.net,debugging,C#,.net,Debugging,例如:创建一个新的Windows.Forms项目并给它一个按钮。添加以下代码: protected override void OnDeactivate(EventArgs e) { base.OnDeactivate(e); Debug.WriteLine("deactivated"); } private void button1_Click(object sender, EventArgs e) { Debug.WriteLine("hello"); } 正如预

例如:创建一个新的Windows.Forms项目并给它一个按钮。添加以下代码:

protected override void OnDeactivate(EventArgs e)
{
    base.OnDeactivate(e);
    Debug.WriteLine("deactivated");
}

private void button1_Click(object sender, EventArgs e)
{
    Debug.WriteLine("hello");
}
正如预期的那样,当单击按钮时,输出窗口显示“hello”,当其他窗口被激活时,输出窗口显示“deactivated”

现在,在Debug.Writeline(“hello”)上放置一个断点。单击按钮,然后继续执行。请注意,输出窗口同时显示“hello”和“deactivated”

我想找到一种防止这种情况发生的方法,这样调试我的应用程序不会改变它的行为。正如断点不存在一样,单击处理程序应该运行,而停用处理程序不应该运行

最好在VisualStudio中找到一个设置,这样命中断点就不会在应用程序中触发deactivate事件。我还没有找到这样的背景

如果能找到一种方法来知道代替我激活的应用程序是Visual Studio(更好的方法是:它是某种调试工具……这个程序很可能使用Visual Studio代码或Mono Develop进行调试)。这样我就可以在这种情况下不执行停用行为

可以在断点上设置操作,该操作将在程序中设置阻止该操作的标志。这是一个非常不受欢迎的解决方案,因为每个程序员都必须记住,每次在不需要停用操作的断点处创建断点时都要这样做

远程调试是另一个潜在的解决方案;但我不想用另一个系统进行所有调试

(注:在实际应用程序中,停用时发生的事情是保存用户正在编辑的内容。问题是,当我在调试其他东西时,意外的保存会使事情变得混乱。数据可能没有保存的有效状态。”“远程调试是另一个潜在的解决方案;但我不想用另一个系统来完成所有的调试。”(我猜这也排除了使用虚拟机的可能性)

我的建议是通过编写单元测试来减少对正在运行的应用程序的调试依赖性。通过单元测试,您可以独立于其他部分测试系统的独立部分

当单元测试就绪时,您可以在调试下运行每个单独的测试,这样您就可以像调试应用程序一样逐步完成代码;但是由于您需要定义测试的范围,所以整个应用程序都没有运行,所以像应用程序失去焦点这样的事情可能会超出范围

一旦测试到位,它可以缩短代码+调试迭代周期所花费的时间,使您的工作效率更高。这是因为测试会在已设置测试场景的情况下直接激发您进入相关代码,而不是启动整个应用程序,并且您每次都导航到相关部分进入你想要的场景


这些测试的另一个好处(如果编写方法正确)您可以使它们作为自动生成的一部分运行,该自动生成在有人更改某些代码时触发。这意味着,如果有人破坏了该代码,测试将失败,生成将失败。

检查
调试器是否足够。IsAttached
?调试时您将无法在
中运行代码使用预处理器指令:使用Debugger.IsAttached是一种有趣的可能性。缺点是当窗口正常停用时(与断点相反),无法获得停用行为。但它可以在实际调试该功能时删除,同时启用deactivate干扰的调试代码。我不确定您对预处理器指令的建议。我可以使用#if!DEBUG或只是#if false为特定调试会话禁用deactivate代码,但这并不能区分breakpoint从其他程序中停用。这是有道理的,而且我们有一个自动运行的大量单元测试集合。但是要对一个主要是GUI的大型程序进行充分的单元测试是非常困难的,而且我们还需要在整个系统中处理一些bug。