【问题标题】:How to debug winforms designer如何调试winforms设计器
【发布时间】:2016-09-17 18:02:07
【问题描述】:

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

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

我知道 windows 窗体和 ASP 是不同的,但是在实际渲染之前应该有一些事件来检查控件的值。

我的表单需要很长时间才能在 VS 设计器中打开。所以我附上了 调试器到 VisualStudio (devenv.exe),在我的表单中设置断点 InitializeComponent 单步执行它以查看问题所在。 但是,断点没有被命中。

【问题讨论】:

  • 设计器类存储在 System.Design.dll 中。它是框架的一部分,并不是为了支持调试而构建的。我想通过删除 ngen-ed 文件,使用 /debug 选项重新生成它并依赖源代码的参考源,这在技术上是可行的。并不是说我会推荐那个。
  • @HansPassant,谢谢,我会试一试。我的意思是如果没有其他办法

标签: c# winforms debugging windows-forms-designer


【解决方案1】:

要在设计器中进行调试,您需要在设计器代码之上放置一个断点。

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

按 F11 一次移动一行。

【讨论】:

  • 谢谢,我试试看
【解决方案2】:

调试 Windows 窗体项目的设计时:

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

我什么时候可以发现这种方法有用?

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

更多信息:

【讨论】:

  • 任何控件都没有异常。由于耗时的控制(大约 30 分钟),我的设计师冻结了。我无法找到导致此问题的控件,因此如果我可以调试设计器,我可能会找到罪魁祸首
  • 因此您可能会发现这种方法很有用。您不需要调试设计器的 dll,以这种方式调试设计器就足够了。还要确保你知道设计师是如何工作的。您可能会发现 this postthis one 很有帮助。
  • 对我不起作用:一旦原始 VS 实例处于运行模式,所有断点都会得到带有黄色三角形感叹号图标的空心红色圆圈,表示“没有为此加载任何符号文档”(正常调试工作正常)。因此,当我在生成的调试对象实例中打开设计时,正在运行的实例中没有任何反应。是的,我确保在开始之前一切都已正确构建,并在两种情况下都打开了相同的项目。
  • @CeeMcSharpface 这很简单。但有时 Visual Studio 缓存文件可能会出现问题。因此,首先关闭所有 VS 实例,并清理项目的 bin 和 obj 文件夹。然后看看 this post 并清理 Visual Studio 设计器缓存的程序集。然后按照这篇文章的说明进行操作。希望它有所帮助:)
【解决方案3】:

您可以使用另一个 Visual Studio 实例调试 Visual Studio:https://stackoverflow.com/a/7757140/343309

如果您遇到设计时错误并且无法恢复设计视图,您可以打开另一个 Visual Studio 并附加当前的 Visual Studio 进程进行调试。

【讨论】:

    【解决方案4】:

    通过下面的堆栈溢出问题How does the Winforms Designer instantiate my form?找到了一篇很老(差不多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,再次执行step-2。

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

    注意: 以上步骤中的Form1.cs 是指windows 窗体项目中的一个窗体。名称可能因您的项目而异

    【讨论】:

      【解决方案5】:

      转到工具 → 选项 → 从左窗格窗口展开调试 → 仅启用我的代码 [只需选中此复选框] → 确定。

      【讨论】:

        猜你喜欢
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多