如何调试WinForms设计器

8

我的问题不是如何在设计时进行调试。我实际上想通过设计器中可用的事件来进行调试。我知道窗体有加载和其他类型的事件。Windows窗体设计器中是否有类似于init、load等的事件?

我曾经在ASP.NET中通过用户控件进行类似的调试。它允许我们在将用户控件添加到设计器之前查看输出的HTML。

我知道Windows窗体和ASP.NET不同,但应该有一些事件可以在实际呈现控件之前检查控件的值。

我的窗体在VS设计器中打开需要很长时间,所以我附加了一个调试器到VisualStudio(devenv.exe),在我的Form的InitializeComponent方法中设置了一个断点来逐步查看问题所在。然而,断点没有被命中。


2
演练:在设计时调试自定义 Windows 表单控件 - Reza Aghaei
2
设计师类储存在System.Design.dll中。它是框架的一部分,不支持调试。理论上可以通过删除ngen-ed文件,以/debug选项重新生成ngen文件,并依靠参考源代码进行调试。虽然我不会建议这样做。 - Hans Passant
@HansPassant,谢谢,我会尝试的。我的意思是如果没有其他办法的话。 - Kira
5个回答

7

调试窗体项目的设计时:

  • 右键单击解决方案资源管理器中的项目,打开属性
  • 在属性页面中选择调试选项卡。
  • 开始操作部分,选择启动外部程序,然后单击按钮浏览Visual Studio可执行文件devenv.exe,该文件位于类似于"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe"的路径中。
  • 保存项目,然后使用F5运行。将打开Visual Studio的一个新实例。
  • 使用新实例打开项目。这将使您能够调试之前包含项目的Visual Studio实例。
  • 在要在实例中进行调试的文件中设置断点。

何时可以使用此方法?

  • 当您在设计时遇到异常时。
  • 当您想要在设计时调试DesignerTypeConverterUiTypeEditor的行为时。

获取更多信息:


任何控件都没有异常。我的设计师因为一个耗时约30分钟的控件而冻结了。我找不到是哪个控件导致了这个问题,所以如果我能调试设计师,我可能会找到罪魁祸首。 - Kira
所以你可能会发现这种方法很有用。你不需要调试设计师的dll,以这种方式调试设计师就足够了。同时确保你知道设计师是如何工作的。你可能会发现这篇文章这篇文章有帮助。 - Reza Aghaei
对我来说没有用:一旦原始的VS实例处于运行模式,所有断点都会出现空心红圆圈和黄色三角感叹号图标,显示“此文档未加载任何符号”(正常调试工作正常)。因此,当我在生成的调试实例中打开设计时,运行实例中什么也不会发生。是的,我确保在启动之前构建了所有内容,并在两个实例中打开了完全相同的项目。 - Cee McSharpface
@CeeMcSharpface 这很简单。但有时在Visual Studio缓存文件中可能会出现问题。因此,首先关闭所有VS实例,并清理项目的bin和obj文件夹。然后查看此帖子,并清除Visual Studio设计器缓存的程序集。然后按照此帖子的说明操作。希望能有所帮助 :) - Reza Aghaei

3

在设计器中进行调试,您需要在设计器代码的顶部设置断点。

然后启动您的应用程序,它会停在断点处。

按F11逐行执行代码。

进入图片描述


谢谢,我会尝试一下。 - Kira

2

在左窗格中选择 扩展调试

进入 工具 → 选项 → 扩展调试 → 启用仅限我的代码 [只需取消勾选此复选框] → 确定。


1
你可以使用另一个Visual Studio实例来调试Visual Studio:https://dev59.com/sVzUa4cB1Zd3GeqP0zIr#7757140 如果遇到设计时错误并且无法恢复设计视图,您可以打开另一个Visual Studio并附加当前Visual Studio进程以进行调试。

1

通过以下堆栈溢出问题Winforms设计器如何实例化我的表单?,找到一篇非常古老(近12年)的博客文章。

博客:https://blogs.msdn.microsoft.com/rprabhu/2004/12/12/how-does-the-windows-forms-designer-in-visual-studio-load-a-form/

上述博客中的一句引用指引我朝正确的方向

好吧,设计器根本没有实例化Form1。它正在创建一个Form1的基类实例

根据上述引用,按照以下步骤查找使设计器变慢的代码:

1)创建一个扩展Form的类并将其添加到您的winforms项目中

public class DebuggableForm : Form
{
    public DebuggableForm()
    {
        //Put your code in InitializeComponent method here.
        //Through line-by-line debugging you can find 
        //which line is making the designer slow
    }
}

2) 在Form1.cs中,不要直接扩展Form而是扩展上述类。这里的Form1是表单的名称,请在您的项目中检查相应的表单名称。

public class Form1: DebuggableForm
{
//Your actual form code
}

3) 在步骤1中创建的类 (DebuggableForm) 的构造函数中放置一个断点。

4) 将您的项目附加到另一个VS实例并在新的VS中打开一个项目。

5) 在新打开的项目中打开form1.cs并再次执行步骤2。

6) 打开设计器或在解决方案资源管理器中双击Form1。您的调试器将命中DebuggableForm中的断点。

注意: 上述步骤中的Form1.cs是指Windows表单项目中的一个窗体。在您的项目中可能会有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接