演练:设计时调试自定义 Windows 窗体控件

创建自定义控件时,你通常会发现有必要调试其设计时行为。 如果要为自定义控件创作自定义设计器,则尤其如此。 有关详细信息,请参阅演练:创建一个利用 Visual Studio 设计时功能的 Windows 窗体控件

可以使用 Visual Studio 调试自定义控件,就像调试任何其他 .NET Framework 类一样。 区别在于,你将调试的是运行自定义控件代码的 Visual Studio 的单独实例。

重要

本文主要适用于使用 .NET Framework Windows 窗体的经典进程内设计器。 这些过程可能不是直接适用的,也可能与面向 .NET(而不是 .NET Framework)的项目完全兼容。

对于 .NET Framework 项目,设计器中完全支持使用平台目标设置编译的任何x64 的项目。 使用 ActiveX、COM 或其他 32 位组件的项目可能存在兼容性问题。 目前为预览版的 Out-Of_Process 框架设计器解决了其中许多兼容性问题。 但是,设计时功能可能无法正常工作,以及 64 位进程内设计器。 若要启用进程外框架设计器,请导航到“工具”>“选项”>“环境”>“预览功能”。

有关进程外设计器的详细信息,请参阅设计器自 .NET Framework 以来的更改

创建项目

第一步是创建应用程序项目。 将使用此项目生成承载自定义控件的应用程序。

在 Visual Studio 中创建 Windows 应用程序项目,并将其命名为 DebuggingExample

创建控件库项目

  1. 将“Windows 控件库”项目添加到解决方案

  2. 将新的 UserControl 项添加到 DebugControlLibrary 项目。 将其命名为 DebugControl

  3. 在“解决方案资源管理器”中,通过删除基名称为 UserControl1 的代码文件来删除项目的默认控件

  4. 生成解决方案。

Checkpoint

此时,你将能够在“工具箱”中看到自定义控件

若要查看进度,请找到名为“DebugControlLibrary 组件”的新选项卡,然后单击以将其选中。 选项卡打开后,可以看到控件作为 DebugControl 列出,旁边有一个默认图标

向自定义控件添加属性

若要演示自定义控件代码在设计时运行,需要添加属性并在实现该属性的代码中设置断点。

  1. 打开“代码编辑器”中的“DebugControl”。 在类定义中添加以下代码:

    Private demoStringValue As String = Nothing
    <BrowsableAttribute(true)>
    Public Property DemoString() As String
    
        Get
            Return Me.demoStringValue
        End Get
    
        Set(ByVal value As String)
            Me.demoStringValue = value
        End Set
    
    End Property
    
    private string demoStringValue = null;
    [Browsable(true)]
    public string DemoString
    {
        get
        {
            return this.demoStringValue;
        }
        set
        {
            demoStringValue = value;
        }
    }
    
  2. 生成解决方案。

将自定义控件添加到主机窗体

若要调试自定义控件的设计时行为,需要将自定义控件类的实例放置在主机窗体上。

  1. 在“DebuggingExample”项目中,打开“Windows 窗体设计器”中的“Form1”

  2. 在“工具箱”中,打开“DebugControlLibrary 组件”选项卡,然后将“DebugControl”实例拖动到窗体上

  3. 在“属性”窗口中找到 DemoString 自定义属性。 请注意,可以像更改任何其他属性一样更改其值。 另请注意,选中 DemoString 属性后,属性的说明字符串将显示在“属性”窗口底部

设置项目以便进行设计时调试

若要调试自定义控件的设计时行为,需要调试运行自定义控件代码的 Visual Studio 的单独实例。

  1. 右键单击“解决方案资源管理器”中的“DebugControlLibrary”项目,然后选择“属性”

  2. 在 DebugControlLibrary 属性表中,选择“调试”选项卡

    在“启动操作”部分中,选择“启动外部程序”。 你会调试 Visual Studio 的单独实例,因此请单击省略号 (The Ellipsis button (...) in the Properties window of Visual Studio) 按钮以浏览 Visual Studio IDE。 可执行文件的名称为 devenv.exe,如果安装到默认位置,则其路径为 %ProgramFiles(x86)%\Microsoft Visual Studio\2019\<edition>\Common7\IDE

  3. 选择“确定”关闭对话框 。

  4. 右键单击 DebugControlLibrary 项目,然后选择“设为启动项目”以启用此调试配置

在设计时调试自定义控件

现在,自定义控件在设计模式下运行,因此可以对其进行调试。 启动调试会话后,将创建 Visual Studio 的新实例,你将使用此实例来加载“DebuggingExample”解决方案。 打开“窗体设计器”中的 Form1 后,将创建自定义控件的实例,并开始运行

  1. 打开“代码编辑器”中的“DebugControl”源文件,并在 DemoString 属性的 Set 访问器上放置一个断点

  2. 按 F5 启动调试会话。 会创建 Visual Studio 的新实例。 可以通过两种方式区分实例:

    • 调试实例的标题栏中显示“正在运行”一词

    • 调试实例的“调试”工具栏上禁用了“开始”按钮

    断点在调试实例中进行设置。

  3. 在 Visual Studio 的新实例中,打开“DebuggingExample”解决方案。 可以通过从“文件”菜单中选择“最近使用的项目”来轻松找到解决方案。 “DebuggingExample.sln”解决方案文件会列为最近使用的文件。

    重要

    如果要调试 .NET 6 或更高版本的 Windows 窗体项目,请不要加载项目,请改用 Visual Studio 的此实例将调试器附加到 DesignToolsServer.exe 进程。 选择“调试”>“附加到进程”菜单项。 在进程列表中找到 DesignToolsServer.exe,然后按“附加”。 有关详细信息,请参阅自 .NET Framework 以来的设计器更改

  4. 打开“窗体设计器”中的 Form1,然后选择“DebugControl”控件

  5. 更改 DemoString 属性的值。 提交更改时,Visual Studio 的调试实例将获得焦点并在断点处停止执行。 可以像处理任何其他代码一样单步执行属性访问器。

  6. 若要停止调试,请退出 Visual Studio 的托管实例,或选择调试实例中的“停止调试”按钮

后续步骤

现在,你可以在设计时调试自定义控件,有多种方式可以扩展控件与 Visual Studio IDE 的交互。

另请参阅