调试器可视化工具的体系结构有两个部分:
调试器端在 Visual Studio 调试器中运行。 调试器端代码创建并显示可视化工具的用户界面。
调试对象端在 Visual Studio 正在调试的进程中运行(调试对象)。
可视化工具是一个调试器组件,它使调试器能够以有意义的可理解形式显示数据对象的内容(可视化)。 某些可视化工具还支持编辑数据对象。 通过编写自定义可视化工具,可以扩展调试器来处理自己的自定义数据类型。
要可视化的数据对象驻留在正在调试的进程( 调试对象 进程) 中。 将在 Visual Studio 调试器进程中创建显示数据的用户界面:
| 调试器进程 | 调试进程 |
|---|---|
| 调试器用户界面(数据提示、监视窗口、快速监视) | 要可视化的数据对象 |
若要在调试器接口中可视化数据对象,需要代码才能在两个进程之间通信。 因此,可视化工具体系结构由两个部分组成: 调试器端 代码和 调试对象端 代码。
调试器端代码创建自己的用户界面,可以从调试器接口(例如 DataTip、监视窗口或 QuickWatch)调用。 可视化工具接口是使用 DialogDebuggerVisualizer 类和 IDialogVisualizerService 接口创建的。 与所有可视化工具 API 一样,在命名空间中找到 Microsoft.VisualStudio.DebuggerVisualizers DialogDebuggerVisualizer 和 IDialogVisualizerService。
| 调试器端 | 调试对象端 |
|---|---|
| DialogDebuggerVisualizer 类 IDialogVisualizerService 接口 |
数据对象 |
用户界面从调试器端存在的对象提供程序获取要可视化的数据:
| 调试器端 | 调试对象端 |
|---|---|
| DialogDebuggerVisualizer 类 IDialogVisualizerService 接口 |
数据对象 |
| 对象提供者(实现 IVisualizerObjectProvider) |
调试对象端有一个名为“对象源”的对应对象:
| 调试器端 | 调试对象端 |
|---|---|
| DialogDebuggerVisualizer 类 IDialogVisualizerService 接口 |
数据对象 |
| 对象提供程序 (实现 IVisualizerObjectProvider) | 对象源 (派生自 VisualizerObjectSource) |
对象提供程序提供要可视化到可视化工具 UI 的对象数据。 对象提供程序从对象源获取对象数据。 对象提供程序和对象源提供 API,用于在调试器端和调试对象端之间通信对象数据。
每个可视化工具都必须获取要可视化的数据对象。 下表显示了对象提供程序和对象源用于此目的的相应 API:
| 对象提供程序 | 对象源 |
|---|---|
| GetData —或— GetObject |
GetData |
请注意,对象提供程序可以使用GetData或GetObject。 任一 API 都会导致对 GetData 对象源的调用。 调用 Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData 来填充 System.IO.Stream,System.IO.Stream 表示正在可视化的对象的序列化形式。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject 将数据反序列化回对象窗体,然后可以在创建的 DialogDebuggerVisualizerUI 中显示这些数据。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData 将数据填充为原始Stream,需要自行反序列化。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject 通过调用 Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData 来获取序列化 Stream的数据,然后反序列化数据。 当对象不可由 .NET 序列化且需要自定义序列化时使用 Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData 。 在这种情况下,您还必须重写该Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize方法。
如果您正在创建一个只读可视化工具,通过GetData或GetObject进行单向通信就足够了。 如果您要创建一个支持编辑数据对象的可视化工具,则需要进行更多操作。 还必须能够将数据对象从对象提供程序发送回对象源。 下表显示了用于此目的的对象提供程序和对象源 API:
| 对象提供程序 | 对象源 |
|---|---|
| ReplaceData —或— ReplaceObject |
CreateReplacementObject |
再次请注意,对象提供程序可以使用两个 API。 数据始终以Stream的形式从对象提供者发送到对象源,但是你需要自己将对象序列化为Stream。
ReplaceObject获取你提供的对象,将其序列化为一个Stream对象,然后调用ReplaceData将其发送到StreamCreateReplacementObject。
使用 Replace 方法之一在调试对象中创建一个新的数据对象,以替换正在可视化的对象。 如果要更改原始对象的内容而不替换它,请使用下表所示的 Transfer 方法之一。 这些 API 同时向两个方向传输数据,而无需替换正在可视化的对象:
| 对象提供程序 | 对象源 |
|---|---|
| TransferData —或— TransferObject |
TransferData |