可视化和查看数据

类型可视化工具和自定义查看器以对开发人员快速有意义的方式呈现数据。 表达式计算器(企业版)可以支持第三方类型可视化工具,并提供自己的自定义查看器。

Visual Studio 通过调用 GetCustomViewerCount 方法来确定与对象类型关联的类型可视化工具和自定义查看器数。 如果至少有一个类型可视化工具或自定义查看器可用,Visual Studio 将调用 GetCustomViewerList 方法来检索这些可视化工具和查看器的列表(实际上,实现可视化工具和查看器的列表)并将其呈现给用户。

支持类型可视化工具

企业版必须实现许多接口来支持类型可视化工具。 这些接口可以分为两大类:列出类型可视化工具的接口和访问属性数据的接口。

列出类型可视化工具

企业版支持在其实现中列出类型可视化工具及其实现IDebugProperty3::GetCustomViewerCount中的类型IDebugProperty3::GetCustomViewerList可视化工具。 这些方法将调用传递给相应的方法 GetCustomViewerCountGetCustomViewerList

I企业版VisualizerService 是通过调用 CreateVisualizerService 获取的。 此方法需要 IDebugBinder3 接口,该接口是从传递给 EvaluateSyncIDebugBinder 接口获取的。 IEEVisualizerServiceProvider::CreateVisualizerService还需要传递给 IDebugParsedExpression::EvaluateSyncIDebugSymbolProviderIDebugAddress 接口。 创建IEEVisualizerService接口所需的最后一个接口是企业版实现的 I企业版VisualizerDataProvider 接口。 此接口允许对要可视化的属性进行更改。 所有属性数据都封装在 IDebugObject 接口中,该接口也由企业版实现。

访问属性数据

通过 IPropertyProxy企业版Side 接口访问属性数据。 为了获取此接口,Visual Studio 对属性对象调用 QueryInterface 以获取 IPropertyProxyProvider 接口(在实现 IDebugProperty3 接口的同一对象上实现),然后调用 GetPropertyProxy 方法获取IPropertyProxyEESide接口。

传入和传出IPropertyProxyEESide接口中的所有数据都封装在 I企业版Data存储 接口中。 此接口表示字节数组,并由 Visual Studio 和企业版实现。 当属性的数据要更改时,Visual Studio 会创建一个 IEEDataStorage 保存新数据的对象,并使用该数据对象调用 CreateReplacementObject ,以便获取一个新 IEEDataStorage 对象,而该对象又传递给 InPlaceUpdateObject 以更新该属性的数据。 IPropertyProxyEESide::CreateReplacementObject允许企业版实例化实现接口的IEEDataStorage自己的类。

支持自定义查看器

标志DBG_ATTRIB_VALUE_CUSTOM_VIEWERdwAttribDEBUG_PROPERTY_INFO结构的字段中设置(由对 GetPropertyInfo 的调用返回),以指示该对象具有与之关联的自定义查看器。 设置此标志后,Visual Studio 将使用 QueryInterfaceIDebugProperty2 接口获取 IDebugProperty3 接口。

如果用户选择自定义查看器,Visual Studio 将使用该方法提供的IDebugProperty3::GetCustomViewerList查看器CLSID实例化自定义查看器。 然后,Visual Studio 调用 DisplayValue 向用户显示值。

通常, IDebugCustomViewer::DisplayValue 提供数据的只读视图。 若要允许对数据进行更改,企业版必须实现支持更改属性对象上的数据的自定义接口。 该方法 IDebugCustomViewer::DisplayValue 使用此自定义接口来支持更改数据。 该方法查找作为参数传入的pDebugProperty接口上的IDebugProperty2自定义接口。

支持类型可视化工具和自定义查看器

企业版可以在 GetCustomViewerCount 和 GetCustomViewerList 方法中同时支持类型可视化工具和自定义查看器。 首先,企业版将它提供给 GetCustomViewerCount 方法返回的值的自定义查看器数。 其次,企业版将自己的自定义查看器的 s 追加CLSID到 GetCustomViewerList 方法返回的列表。