Visualización y visualización de datos

Los visualizadores de tipos y los visores personalizados presentan datos de forma que sea rápidamente significativo para un desarrollador. El evaluador de expresiones (EE) puede admitir visualizadores de tipos de terceros, así como proporcionar sus propios visores personalizados.

Visual Studio determina cuántos visualizadores de tipos y visores personalizados están asociados al tipo del objeto llamando al método GetCustomViewerCount . Si hay al menos un visualizador de tipos o visor personalizado disponible, Visual Studio llama al método GetCustomViewerList para recuperar una lista de esos visualizadores y visores (en realidad, una lista de que implementa los visualizadores y visores) y los presenta al usuario.

Visualizadores de tipos auxiliares

Hay una serie de interfaces que la EE debe implementar para admitir visualizadores de tipos. Estas interfaces se pueden dividir en dos categorías generales: interfaces que enumeran los visualizadores de tipos e interfaces que acceden a los datos de propiedad.

Visualizadores de tipos de lista

Ee admite la enumeración de los visualizadores de tipos en su implementación de IDebugProperty3::GetCustomViewerCount y IDebugProperty3::GetCustomViewerList. Estos métodos pasan la llamada a los métodos correspondientes GetCustomViewerCount y GetCustomViewerList.

IEEVisualizerService se obtiene llamando a CreateVisualizerService. Este método requiere la interfaz IDebugBinder3 , que se obtiene de la interfaz IDebugBinder que se pasa a EvaluateSync. IEEVisualizerServiceProvider::CreateVisualizerServicetambién requiere las interfaces IDebugSymbolProvider e IDebugAddress, que se pasaron a IDebugParsedExpression::EvaluateSync. La interfaz final necesaria para crear la IEEVisualizerService interfaz es la interfaz IEEVisualizerDataProvider , que implementa la EE. Esta interfaz permite realizar cambios en la propiedad que se va a visualizar. Todos los datos de propiedad se encapsulan en una interfaz IDebugObject , que también implementa ee.

Acceso a datos de propiedad

El acceso a los datos de propiedad se realiza a través de la interfaz IPropertyProxyEESide . Para obtener esta interfaz, Visual Studio llama a QueryInterface en el objeto de propiedad para obtener la interfaz IPropertyProxyProvider (implementada en el mismo objeto que implementa la interfaz IDebugProperty3 ) y, a continuación, llama al método GetPropertyProxy para obtener la IPropertyProxyEESide interfaz.

Todos los datos pasados y fuera de la IPropertyProxyEESide interfaz se encapsulan en la interfaz IEEDataStorage . Esta interfaz representa una matriz de bytes y la implementa Visual Studio y EE. Cuando se van a cambiar los datos de una propiedad, Visual Studio crea un IEEDataStorage objeto que contiene los nuevos datos y llama a CreateReplacementObject con ese objeto de datos para obtener un nuevo IEEDataStorage objeto que, a su vez, se pasa a InPlaceUpdateObject para actualizar los datos de la propiedad. IPropertyProxyEESide::CreateReplacementObject permite a ee crear instancias de su propia clase que implementa la IEEDataStorage interfaz .

Compatibilidad con visores personalizados

La marca DBG_ATTRIB_VALUE_CUSTOM_VIEWER se establece en el dwAttrib campo de la estructura DEBUG_PROPERTY_INFO (devuelta por una llamada a GetPropertyInfo) para indicar que el objeto tiene asociado un visor personalizado. Cuando se establece esta marca, Visual Studio obtiene la interfaz IDebugProperty3 de la interfaz IDebugProperty2 mediante QueryInterface.

Si el usuario selecciona un visor personalizado, Visual Studio crea una instancia del visor personalizado mediante el método proporcionado por el IDebugProperty3::GetCustomViewerList visorCLSID. A continuación, Visual Studio llama a DisplayValue para mostrar el valor al usuario.

Normalmente, IDebugCustomViewer::DisplayValue presenta una vista de solo lectura de los datos. Para permitir cambios en los datos, ee debe implementar una interfaz personalizada que admita el cambio de datos en un objeto de propiedad. El IDebugCustomViewer::DisplayValue método usa esta interfaz personalizada para admitir el cambio de los datos. El método busca la interfaz personalizada en la IDebugProperty2 interfaz pasada como pDebugProperty argumento .

Compatibilidad con visualizadores de tipos y visores personalizados

Un EE puede admitir visualizadores de tipos y visores personalizados en los métodos GetCustomViewerCount y GetCustomViewerList . En primer lugar, ee agrega el número de visores personalizados que proporciona al valor devuelto por el método GetCustomViewerCount . En segundo lugar, ee anexa los CLSIDs de sus propios visores personalizados a la lista devuelta por el método GetCustomViewerList .