可视化工具体系结构
调试器可视化工具的结构由两部分组成:
“调试器端”在 Visual Studio 调试器中运行。 调试器端代码创建并显示可视化工具的用户界面。
“调试对象端”在 Visual Studio 正在调试的进程(“调试对象”)中运行 。
可视化工具是一个调试器组件,借助它,调试器即可以一种有意义且易理解的方式将数据对象的内容显示(“可视化”)出来。 某些可视化工具还支持数据对象编辑。 通过编写自定义可视化工具,可以扩展调试器的功能,使其能够处理你自己的自定义数据类型。
要进行可视化处理的数据对象位于要调试的进程(“调试对象”进程)中。 用于显示数据的用户界面在 Visual Studio 调试器进程内创建:
调试器进程 | 调试对象进程 |
---|---|
调试器用户界面(数据提示、监视窗口、快速监视) | 要可视化的数据对象 |
若要在调试器界面中可视化数据对象,则需要一些代码,以实现两个进程间的通信。 由此可见,可视化工具的体系结构由两部分组成:“调试器端”代码和“调试对象端”代码 。
调试器端代码用于创建其自身用户界面,该界面可从调试器界面调用,例如数据提示、监视窗口或快速监视。 可以使用 DialogDebuggerVisualizer 类和 IDialogVisualizerService 界面来创建可视化工具界面。 与所有的可视化工具 API 一样,DialogDebuggerVisualizer 和 IDialogVisualizerService 可在 Microsoft.VisualStudio.DebuggerVisualizers 命名空间中找到。
调试器端 | 调试对象端 |
---|---|
DialogDebuggerVisualizer 类 IDialogVisualizerService 界面 |
数据对象 |
用户界面可从位于调试器端的对象提供程序获得要可视化的数据:
调试器端 | 调试对象端 |
---|---|
DialogDebuggerVisualizer 类 IDialogVisualizerService 界面 |
数据对象 |
对象提供程序(实现 IVisualizerObjectProvider) |
调试对象端有一个对应的对象,称作对象源:
调试器端 | 调试对象端 |
---|---|
DialogDebuggerVisualizer 类 IDialogVisualizerService 界面 |
数据对象 |
对象提供程序(实现 IVisualizerObjectProvider) | 对象源(从 VisualizerObjectSource 派生) |
对象提供程序向可视化工具用户界面提供要可视化的对象数据。 这些数据对象是对象提供程序从对象源获得的。 对象提供程序和对象源提供 API,以便在调试器端和调试对象端之间传输对象数据。
每个可视化工具都必须获得要可视化的数据对象。 下表给出了对象提供程序和对象源用于此目的的相应 API:
对象提供程序 | 对象源 |
---|---|
GetData \- 或 - GetObject |
GetData |
注意,对象提供程序既可使用 GetData,也可使用 GetObject。 其个任何一个 API 均会针对对象源调用 GetData。 对 Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData 的调用将填充 System.IO.Stream,它以序列化的方式将要可视化的对象呈现出来。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject 将数据重新反序列化为对象形式,使你可以在使用 DialogDebuggerVisualizer 创建的 UI 中显示该对象。 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
的形式从对象提供程序发送到对象源,但是,ReplaceData 要求你自己将对象序列化为 Stream
。
ReplaceObject 获取你提供的对象,将其序列化为 Stream
,然后调用 ReplaceData 将 Stream
发送到 CreateReplacementObject。
使用其中任意一个 Replace 方法将在调试对象中创建一个新数据对象,然后用该对象代替要可视化的对象。 如果你要更改原始对象的内容但不替换它,请使用下表中给出的一个 Transfer 方法。 这些 API 可同时进行双向数据传输,而无需替换要可视化的对象:
对象提供程序 | 对象源 |
---|---|
TransferData —或— TransferObject |
TransferData |