可视化工具体系结构
更新:2007 年 11 月
本主题适用于:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
速成版 |
![]() |
![]() |
仅限托管 |
![]() |
标准版 |
![]() |
![]() |
仅限托管 |
![]() |
专业团队版 |
![]() |
![]() |
仅限托管 |
![]() |
表格图例:
![]() |
适用 |
![]() |
不适用 |
![]() |
默认情况下隐藏的一条或多条命令。 |
调试器可视化工具的结构由两部分组成:
“调试器端”在 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。其个任何一个 API 均会针对对象源调用 GetData。对 VisualizerObjectSource.GetData 的调用将填充 [System.IO.Stream],它以序列化的方式将要可视化的对象呈现出来。
IVisualizerObjectProvider.GetObject 将这些数据反序列化为对象形式,使您可以在使用 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 可同时进行双向数据传输,而无需替换要可视化的对象:
对象提供程序 |
对象源 |
---|---|
- 或 - |