可视化工具体系结构
调试器可视化工具的结构由两部分组成:
调试器端 " 在 Visual Studio 调试器中运行。 调试器端代码创建并显示可视化工具的用户界面。
调试对象端 在处理 Visual Studio 中运行调试 (调试对象)。
可视化工具是调试器显示的调试器可视化元素 () 一个数据对象的内容的一种有意义,借助它 某些可视化工具还支持数据对象编辑。 通过编写自定义可视化工具,可以处理扩展调试器您的自定义数据类型。
要可视化的数据对象位于要调试的进程 (" 调试对象 " 进程)。 用于显示数据的用户界面在 Visual Studio 调试器进程内创建:
调试器进程 |
调试对象进程 |
---|---|
调试器用户界面 (ui) 中, " 监视 " 窗口, ") |
要可视化的数据对象 |
若要在调试器界面中可视化数据对象,则需要代码间通信两个进程。 因此,可视化工具体系结构由两部分组成: 调试器端 代码与调试对象 端 代码。
调试器端代码创建自己的用户界面,可从调试器接口调用,例如数据提示、监视窗口或 " 快速监视 "。 使用 DialogDebuggerVisualizer 类和 IDialogVisualizerService 接口,工具界面创建。 与所有的可视化工具 API, DialogDebuggerVisualizer 和 IDialogVisualizerService 可在 Microsoft.VisualStudio.DebuggerVisualizers 命名空间中找到。
调试器端 |
调试对象端 |
---|---|
DialogDebuggerVisualizer 类 IDialogVisualizerService 界面 |
数据对象 |
用户界面从获取数据对象提供可视化,在调试器端存在:
调试器端 |
调试对象端 |
---|---|
DialogDebuggerVisualizer 类 IDialogVisualizerService 界面 |
数据对象 |
对象提供程序 (实现 IVisualizerObjectProvider) |
在调用对象源的调试对象端中的相应对象:
调试器端 |
调试对象端 |
---|---|
DialogDebuggerVisualizer 类 IDialogVisualizerService 界面 |
数据对象 |
对象提供程序 (实现 IVisualizerObjectProvider) |
对象源 (从派生 VisualizerObjectSource) |
对象提供程序提供要可视化向可视化工具用户界面的对象数据。 对象提供程序从对象源获得对象数据。 对象提供程序和对象源提供了 API 以及在调试器和调试对象端之间的对象数据。
必须获得要可视化的数据对象每个可视化工具。 下表显示相应 API,对象提供程序和对象源用于此用途:
对象提供程序 |
对象源 |
---|---|
—或 - |
通知对象提供程序可使用 GetData 或 GetObject。 在调用的任何一个 API 结果对象源的 GetData 。 为 VisualizerObjectSource.GetData 的调用填充 [System.IO.Stream],表示对象的已序列化的方式可视化。
IVisualizerObjectProvider.GetObject 将数据传回对象形式,可以在 UI 中显示该用 DialogDebuggerVisualizer创建。 IVisualizerObjectProvider.GetData 填入原始形式的数据的 [System.IO.Stream],您必须自己反序列化这些数据。 IVisualizerObjectProvider.GetObject 工作在调用 IVisualizerObjectProvider.GetData 获取旁边的序列化 [System.IO.Stream],然后反序列化数据。 ,当对象由 .NET 无法序列化并且不需要自定义序列化时,请使用 IVisualizerObjectProvider.GetData 。 在这种情况下,您还必须重写 VisualizerObjectSource.Serialize 方法。
如果要创建只读可视化工具,使用 GetData 或 GetObject 的单向通信就足够了。 如果要创建支持数据对象编辑的可视化工具,您必须执行更多。 您必须能够将数据对象从对象提供程序到源对象。 下表显示用于此目的对象提供程序和对象源 API:
对象提供程序 |
对象源 |
---|---|
—或 - |
请注意,同样,具有对象提供程序可使用的两个 API。 数据从对象提供程序总是发送到源对象作为 [System.IO.Stream],但是, ReplaceData 要求您将对象序列化为 [System.IO.Stream] 。
ReplaceObject 获取您提供的对象,序列化到 [System.IO.Stream],然后调用 ReplaceData 发送 [System.IO.Stream] 到 CreateReplacementObject。
使用一个 replace 方法将在对象的调试对象创建一个新数据对象。 如果您要更改原始对象的内容,而无需替换它,请使用下表中显示的一个 transfer 方法。 这些 API 同时转换在两个方向的数据,,而不必替换可视化的对象:
对象提供程序 |
对象源 |
---|---|
—或 - |