可视化工具体系结构

调试器可视化工具的体系结构有两个部分:

  • 调试器端在 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

请注意,对象提供程序可以使用GetDataGetObject。 任一 API 都会导致对 GetData 对象源的调用。 调用 Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData 来填充 System.IO.StreamSystem.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方法。

如果您正在创建一个只读可视化工具,通过GetDataGetObject进行单向通信就足够了。 如果您要创建一个支持编辑数据对象的可视化工具,则需要进行更多操作。 还必须能够将数据对象从对象提供程序发送回对象源。 下表显示了用于此目的的对象提供程序和对象源 API:

对象提供程序 对象源
ReplaceData

—或—

ReplaceObject
CreateReplacementObject

再次请注意,对象提供程序可以使用两个 API。 数据始终以Stream的形式从对象提供者发送到对象源,但是你需要自己将对象序列化为Stream

ReplaceObject获取你提供的对象,将其序列化为一个Stream对象,然后调用ReplaceData将其发送到StreamCreateReplacementObject

使用 Replace 方法之一在调试对象中创建一个新的数据对象,以替换正在可视化的对象。 如果要更改原始对象的内容而不替换它,请使用下表所示的 Transfer 方法之一。 这些 API 同时向两个方向传输数据,而无需替换正在可视化的对象:

对象提供程序 对象源
TransferData

—或—

TransferObject
TransferData