Comment : listes d'exposition de symboles fournis par la bibliothèque au gestionnaire d'objets
les outils de symbole-navigation, Affichage de classes, Explorateur d'objets, Explorateur d'appels et Résultats de la recherche de symbole, demandes de passage de nouvelles données au gestionnaire d'objets de Visual Studio . Le gestionnaire d'objets recherche les bibliothèques appropriées et demande de nouvelles listes de symboles. Les bibliothèques répondent en fournissant des données demandées au gestionnaire d'objets de Visual Studio via l'interface d' IVsSimpleObjectList2 . Le gestionnaire d'objets de Visual Studio appelle les méthodes dans l'interface d' IVsSimpleObjectList2 pour obtenir les données et les utilise pour remplir ou mettre à jour vues des outils de symbole-navigation.
Une bibliothèque peut obtenir des demandes de données lorsque l'outil est appelé, le nœud est développée, ou la vue est actualisée. Lorsqu'un outil de symbole-navigation est appelé pour la première fois, le gestionnaire d'objets invite la bibliothèque pour fournir la liste de niveau supérieur. Lorsque l'utilisateur développe un nœud de liste, la bibliothèque fournit une liste d'enfants sous ce nœud. Chaque examen du gestionnaire d'objets contient un index de l'élément concerné. Pour afficher une nouvelle liste, le gestionnaire d'objets doit déterminer le nombre d'éléments sont dans la liste, le type des éléments, leurs noms, accessibilité, et d'autres propriétés.
Notes
les exemples suivants de code managé montrent comment fournir des listes de symboles en implémentant l'interface d' IVsSimpleObjectList2 .Le gestionnaire d'objets appelle les méthodes dans cette interface et utilise les données obtenues pour remplir ou mettre à jour outils de symbole-navigation.
Pour l'implémentation de fournisseur de symboles de code natif, utilisez l'interface d' IVsObjectList2 .
Fourniture des listes de symboles dans le gestionnaire d'objets
Pour fournir des listes de symboles dans le gestionnaire d'objets
Obtient le nombre d'éléments dans la liste de symboles en implémentant la méthode d' GetItemCount . l'exemple suivant montre comment le gestionnaire d'objets obtient les informations sur le nombre d'éléments dans la liste.
Protected m_Methods As System.Collections.Generic.SortedList(Of String, Method) = New System.Collections.Generic.SortedList(Of String, Method)() Public Function GetItemCount(ByRef pCount As UInteger) As Integer pCount = CUInt(m_Methods.Count) Return Microsoft.VisualStudio.VSConstants.S_OK End Function
protected System.Collections.Generic.SortedList<string, Method> m_Methods = new System.Collections.Generic.SortedList<string, Method>(); public int GetItemCount(out uint pCount) { pCount = (uint)m_Methods.Count; return Microsoft.VisualStudio.VSConstants.S_OK; }
Obtenir des informations sur les catégories et les attributs d'un élément de liste donné en implémentant la méthode d' GetCategoryField2 . les catégories d'élément sont spécifiées dans l'énumération d' LIB_CATEGORY . L'exemple suivant montre comment le gestionnaire d'objets obtient les attributs des éléments d'une catégorie donnée.
Public Function GetCategoryField2(ByVal index As UInteger, ByVal Category As Integer, ByRef pfCatField As UInteger) As Integer pfCatField = 0 Select Case CType(Category, LIB_CATEGORY) Case LIB_CATEGORY.LC_MEMBERTYPE pfCatField = CUInt(_LIBCAT_MEMBERTYPE.LCMT_METHOD) Case LIB_CATEGORY.LC_MEMBERACCESS Dim method As Method = m_Methods.Values(CInt(Fix(index))) If method.IsPublic Then pfCatField = CUInt(_LIBCAT_MEMBERACCESS.LCMA_PUBLIC) ElseIf method.IsPrivate Then pfCatField = CUInt(_LIBCAT_MEMBERACCESS.LCMA_PRIVATE) ElseIf method.IsFamily Then pfCatField = CUInt(_LIBCAT_MEMBERACCESS.LCMA_PROTECTED) ElseIf method.IsFamilyOrAssembly Then pfCatField = CUInt(_LIBCAT_MEMBERACCESS.LCMA_PROTECTED) Or CUInt(_LIBCAT_MEMBERACCESS.LCMA_PACKAGE) Else ' Show everything else as internal. pfCatField = CUInt(_LIBCAT_MEMBERACCESS.LCMA_PACKAGE) End If Case LIB_CATEGORY.LC_VISIBILITY pfCatField = CUInt(_LIBCAT_VISIBILITY.LCV_VISIBLE) Case LIB_CATEGORY.LC_LISTTYPE pfCatField = CUInt(_LIB_LISTTYPE.LLT_MEMBERS) Case Else Return Microsoft.VisualStudio.VSConstants.S_FALSE End Select Return Microsoft.VisualStudio.VSConstants.S_OK End Function
public int GetCategoryField2(uint index, int Category, out uint pfCatField) { pfCatField = 0; switch ((LIB_CATEGORY)Category) { case LIB_CATEGORY.LC_MEMBERTYPE: pfCatField = (uint)_LIBCAT_MEMBERTYPE.LCMT_METHOD; break; case LIB_CATEGORY.LC_MEMBERACCESS: { Method method = m_Methods.Values[(int)index]; if (method.IsPublic) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PUBLIC; } else if (method.IsPrivate) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PRIVATE; } else if (method.IsFamily) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PROTECTED; } else if (method.IsFamilyOrAssembly) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PROTECTED | (uint)_LIBCAT_MEMBERACCESS.LCMA_PACKAGE; } else { // Show everything else as internal. pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PACKAGE; } } break; case LIB_CATEGORY.LC_VISIBILITY: pfCatField = (uint)_LIBCAT_VISIBILITY.LCV_VISIBLE; break; case LIB_CATEGORY.LC_LISTTYPE: pfCatField = (uint)_LIB_LISTTYPE.LLT_MEMBERS; break; default: return Microsoft.VisualStudio.VSConstants.S_FALSE; } return Microsoft.VisualStudio.VSConstants.S_OK; }
obtenez la représentation textuelle d'un élément de liste donné en implémentant la méthode d' GetTextWithOwnership . l'exemple suivant montre comment obtenir un nom complet d'un élément donné.
Public Function GetTextWithOwnership(<System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.OLE.Interop.ULONG")> ByVal index As UInteger, <System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.Shell.Interop.VSTREETEXTOPTIONS")> ByVal tto As Microsoft.VisualStudio.Shell.Interop.VSTREETEXTOPTIONS, <System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.OLE.Interop.WCHAR")> ByRef ppszText As String) As Integer ppszText = m_Methods.Values(CInt(Fix(index))).FullName Return Microsoft.VisualStudio.VSConstants.S_OK End Function
public int GetTextWithOwnership([System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.OLE.Interop.ULONG")] uint index, [System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.Shell.Interop.VSTREETEXTOPTIONS")] Microsoft.VisualStudio.Shell.Interop.VSTREETEXTOPTIONS tto, [System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.OLE.Interop.WCHAR")] out string ppszText) { ppszText = m_Methods.Values[(int)index].FullName; return Microsoft.VisualStudio.VSConstants.S_OK; }
Obtenez des informations d'icône d'un élément de liste donné en implémentant la méthode d' GetDisplayData . L'icône représente le type (classe, méthode, etc.), et l'accessibilité (privées, publiques, etc.) d'un élément de liste. L'exemple suivant montre comment obtenir les informations d'icône en fonction de les attributs fournis d'un élément.
Public Overridable Function GetDisplayData(ByVal index As UInteger, ByVal pData As Microsoft.VisualStudio.Shell.Interop.VSTREEDISPLAYDATA()) As Integer If pData Is Nothing Then Return Microsoft.VisualStudio.VSConstants.E_INVALIDARG End If Dim method As Method = m_Methods.Values(CInt(Fix(index))) Dim iImage As Integer = 12 * 6 ' See env\inc\OMGlyphs.h. Const OM_GLYPH_ACC_PUBLIC As Integer = 0 Const OM_GLYPH_ACC_INTERNAL As Integer = 1 Const OM_GLYPH_ACC_PROTECTED As Integer = 3 Const OM_GLYPH_ACC_PRIVATE As Integer = 4 If method.IsPublic Then iImage += OM_GLYPH_ACC_PUBLIC ElseIf method.IsPrivate Then iImage += OM_GLYPH_ACC_PRIVATE ElseIf method.IsFamily Then iImage += OM_GLYPH_ACC_PROTECTED ElseIf method.IsFamilyOrAssembly Then iImage += OM_GLYPH_ACC_PROTECTED Else iImage += OM_GLYPH_ACC_INTERNAL End If pData(0).Image = CUShort(iImage) pData(0).SelectedImage = CUShort(iImage) Return Microsoft.VisualStudio.VSConstants.S_OK End Function
public virtual int GetDisplayData(uint index, Microsoft.VisualStudio.Shell.Interop.VSTREEDISPLAYDATA[] pData) { if (pData == null) { return Microsoft.VisualStudio.VSConstants.E_INVALIDARG; } Method method = m_Methods.Values[(int)index]; int iImage = 12 * 6; // See env\inc\OMGlyphs.h. const int OM_GLYPH_ACC_PUBLIC = 0; const int OM_GLYPH_ACC_INTERNAL = 1; const int OM_GLYPH_ACC_PROTECTED = 3; const int OM_GLYPH_ACC_PRIVATE = 4; if (method.IsPublic) { iImage += OM_GLYPH_ACC_PUBLIC; } else if (method.IsPrivate) { iImage += OM_GLYPH_ACC_PRIVATE; } else if (method.IsFamily) { iImage += OM_GLYPH_ACC_PROTECTED; } else if (method.IsFamilyOrAssembly) { iImage += OM_GLYPH_ACC_PROTECTED; } else { iImage += OM_GLYPH_ACC_INTERNAL; } pData[0].Image = (ushort)iImage; pData[0].SelectedImage = (ushort)iImage; return Microsoft.VisualStudio.VSConstants.S_OK; }
Réussissez les informations si un élément de liste donné peut être développé en implémentant la méthode d' GetExpandable3 . L'exemple suivant montre comment obtenir les informations de si un élément donné peut être développé.
Public Function GetExpandable(ByVal index As UInteger, ByRef pfExpandable As Integer) As Integer pfExpandable = Microsoft.VisualStudio.VSIP.Samples.CallBrowser.Constants.TRUE Return Microsoft.VisualStudio.VSConstants.S_OK End Function Public Function GetExpandable3(ByVal index As UInteger, ByVal ListTypeExcluded As UInteger, ByRef pfExpandable As Integer) As Integer Return GetExpandable(index, pfExpandable) End Function
public int GetExpandable(uint index, out int pfExpandable) { pfExpandable = Microsoft.VisualStudio.VSIP.Samples.CallBrowser.Constants.TRUE; return Microsoft.VisualStudio.VSConstants.S_OK; } public int GetExpandable3(uint index, uint ListTypeExcluded, out int pfExpandable) { return GetExpandable(index, out pfExpandable); }
Obtenez une liste enfant de symboles d'un élément de liste donné en implémentant la méthode d' GetList2 . L'exemple suivant montre comment obtenir une liste enfant de symboles d'un élément spécifique pour Appel ou des graphiques d' appelants .
' Call graph list. Public Class CallsList Inherits ResultsList Implements Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 Public Sub New(ByVal library As Library) MyBase.New(library) End Sub Public Function GetList2(ByVal index As UInteger, ByVal ListType As UInteger, ByVal flags As UInteger, ByVal pobSrch As Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2(), ByRef ppList As Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2) As Integer Return MyBase.GetCallsList(index, ppList) End Function End Class ' Callers graph list. Public Class CallersList Inherits ResultsList Implements Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 Public Sub New(ByVal library As Library) MyBase.New(library) End Sub Public Function GetList2(ByVal index As UInteger, ByVal ListType As UInteger, ByVal flags As UInteger, ByVal pobSrch As Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2(), ByRef ppList As Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2) As Integer Return MyBase.GetCallersList(index, ppList) End Function End Class ' Call graph list. Public Function GetCallsList(ByVal index As UInteger, ByRef ppList As Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2) As Integer ppList = Nothing Dim callsList As ResultsList = New CallsList(m_Library) Dim method As Method = m_Methods.Values(CInt(Fix(index))) Dim strMethod As String = method.m_strPrototype Dim Calls As System.Collections.Generic.List(Of CallInstance) = m_Library.CallGraph.GetCallGraph(method) For i As Integer = 0 To Calls.Count - 1 Dim caller As Method = Calls(i).m_Target callsList.AddMethod(caller) Next i ppList = CType(callsList, Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2) Return Microsoft.VisualStudio.VSConstants.S_OK End Function ' Callers graph list. Public Function GetCallersList(ByVal index As UInteger, ByRef ppList As Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2) As Integer ppList = Nothing Dim callersList As ResultsList = New CallersList(m_Library) Dim method As Method = m_Methods.Values(CInt(Fix(index))) Dim strMethod As String = method.m_strPrototype Dim Callers As System.Collections.Generic.List(Of CallInstance) = m_Library.CallGraph.GetCallersGraph(method) For i As Integer = 0 To Callers.Count - 1 Dim caller As Method = Callers(i).m_Source callersList.AddMethod(caller) Next i ppList = CType(callersList, Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2) Return Microsoft.VisualStudio.VSConstants.S_OK End Function ' Get a child list of symbols for a given list item. Public Function GetList2(ByVal index As UInteger, ByVal ListType As UInteger, ByVal flags As UInteger, ByVal pobSrch As Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2(), ByRef ppList As Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2) As Integer ppList = Nothing Dim method As Method = m_Methods.Values(CInt(Fix(index))) Dim strMethod As String = method.m_strPrototype ' Determine if the list belongs to Call or Callers graphs. If CUInt(m_nFlags And CUInt(Microsoft.VisualStudio.Shell.Interop._VSOBSEARCHOPTIONS2.VSOBSO_CALLSFROM)) > 0 Then ' Build the list for the Call graph. Return MyBase.GetCallsList(index, ppList) ElseIf CUInt(m_nFlags And CUInt(Microsoft.VisualStudio.Shell.Interop._VSOBSEARCHOPTIONS2.VSOBSO_CALLSTO)) > 0 Then ' Build the list for the Callers graph. Return MyBase.GetCallersList(index, ppList) End If Return Microsoft.VisualStudio.VSConstants.E_FAIL End Function
// Call graph list. public class CallsList : ResultsList, Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 { public CallsList(Library library) : base(library) { } public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { return base.GetCallsList(index, out ppList); } } // Callers graph list. public class CallersList : ResultsList, Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 { public CallersList(Library library) : base(library) { } public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { return base.GetCallersList(index, out ppList); } } // Call graph list. public int GetCallsList(uint index, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; ResultsList callsList = new CallsList(m_Library); Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; System.Collections.Generic.List<CallInstance> Calls = m_Library.CallGraph.GetCallGraph(method); for (int i = 0; i < Calls.Count; i++) { Method caller = Calls[i].m_Target; callsList.AddMethod(caller); } ppList = (Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2)(callsList); return Microsoft.VisualStudio.VSConstants.S_OK; } // Callers graph list. public int GetCallersList(uint index, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; ResultsList callersList = new CallersList(m_Library); Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; System.Collections.Generic.List<CallInstance> Callers = m_Library.CallGraph.GetCallersGraph(method); for (int i = 0; i < Callers.Count; i++) { Method caller = Callers[i].m_Source; callersList.AddMethod(caller); } ppList = (Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2)(callersList); return Microsoft.VisualStudio.VSConstants.S_OK; } // Get a child list of symbols for a given list item. public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; // Determine if the list belongs to Call or Callers graphs. if ((uint)(m_nFlags & (uint)Microsoft.VisualStudio.Shell.Interop._VSOBSEARCHOPTIONS2.VSOBSO_CALLSFROM) > 0) { // Build the list for the Call graph. return base.GetCallsList(index, out ppList); } else if ((uint)(m_nFlags & (uint)Microsoft.VisualStudio.Shell.Interop._VSOBSEARCHOPTIONS2.VSOBSO_CALLSTO) > 0) { // Build the list for the Callers graph. return base.GetCallersList(index, out ppList); } return Microsoft.VisualStudio.VSConstants.E_FAIL; }
Voir aussi
Tâches
Comment : enregistrez une bibliothèque avec le gestionnaire d'objets
Comment : Identifiez les symboles dans une bibliothèque
Concepts
outils de prise en charge de Symbole-Navigation