若要在设计时调试代码,而不是在应用运行时调试代码,可以使用 “即时 ”窗口。
若要从 XAML 设计器(例如声明性数据绑定方案)调试应用背后的 XAML 代码,可以使用 “调试>附加到进程”。
使用“即时”窗口
可以使用 Visual Studio 即时 窗口执行函数或子例程,而无需运行应用。 如果函数或子例程包含断点,Visual Studio 将在断点处中断。 然后,可以使用调试器窗口检查程序状态。 此功能在 设计时称为调试。 有关详细信息,请参阅 “使用即时”窗口
以下示例位于 Visual Basic 中。 还可以在 C#、F# 和 C++/CLI 应用中在设计时使用 即时 窗口。 对于 C++/CLI,编译时不使用 /clr 选项即可使用“即时”窗口。
将以下代码粘贴到空白的 Visual Basic 控制台应用中:
Module Module1 Sub Main() MySub() End Sub Function MyFunction() As Decimal Static i As Integer i = i + 1 Return i End Function Sub MySub() MyFunction() End Sub End Module
在行 End 函数上设置断点。
通过选择“调试> Windows即时”打开“即时”>窗口。 键入
?MyFunction
窗口,然后按 Enter。断点已触发,MyFunction 在 局部窗口中的值为 1。 当应用处于中断模式时,可以检查调用堆栈和其他调试窗口。
在 Visual Studio 工具栏上选择 “继续 ”。 应用程序结束,在Immediate窗口中返回1。 请确保仍处于设计模式。
?MyFunction
再次键入立即窗口中,然后按Enter。 已命中断点,“局部”窗口中 MyFunction 的值为 2。如果不选择“继续”,请在“立即”窗口中键入
?MySub()
,然后按 Enter。 命中断点,“局部变量”窗口中 MyFunction 的值为 3。 可以在应用处于中断模式时检查应用状态。选择继续。 断点再次命中,“局部变量窗口”中 MyFunction 的值现在为 2。 Immediate窗口返回表达式已被计算,但没有返回值。
再次选择 “继续 ”。 应用结束,并在“即时”窗口中返回 2。 请确保仍处于设计模式。
若要清除 “立即 ”窗口的内容,请在窗口中右键单击并选择“ 全部清除”。
在设计时通过附加到 XAML 设计器调试自定义 XAML 控件
在 Visual Studio 中打开解决方案或项目。
生成解决方案/项目。
打开包含要调试的自定义控件的 XAML 页。
对于面向 Windows 内部版本 16299 或更高版本的 UWP 项目,此步骤将启动 UwpSurface.exe 过程。 对于面向 Windows 内部版本 16299 或更高版本的 WPF 项目,此步骤将启动 WpfSurface.exe 过程。 对于 Windows 内部版本 16299 之前的 WPF 或 UWP 版本,此步骤将启动 XDesProc.exe 过程。
打开 Visual Studio 的第二个实例。 不要在第二个实例中打开解决方案或项目。
在 Visual Studio 的第二个实例中,打开 “调试” 菜单,然后选择“ 附加到进程...”。
根据项目类型(请参阅前面的步骤),从可用进程列表中选择 UwpSurface.exe、 WpfSurface.exe或 XDesProc.exe 进程。
在“附加到进程”对话框的“附加到”字段中,选择要调试的自定义控件的正确代码类型。
如果自定义控件已采用 .NET 语言编写,请选择适当的 .NET 代码类型,例如托管代码(CoreCLR)。 如果自定义控件已用 C++ 编写,请选择 “Native”。
单击“ 附加 ”按钮附加 Visual Studio 的第二个实例。
在 Visual Studio 的第二个实例中,打开与要调试的自定义控件关联的代码文件。 请确保只打开文件,而不是整个解决方案或项目。
将必要的断点放置在以前打开的文件中。
在 Visual Studio 的第一个实例中,关闭包含要调试的自定义控件的 XAML 页面(在前面的步骤中打开的相同页面)。
在 Visual Studio 的第一个实例中,打开在上一步中关闭的 XAML 页面。 这将导致调试器在 Visual Studio 的第二个实例中设置的第一个断点处停止。
在 Visual Studio 的第二个实例中调试代码。