Visual Studio Extension récupère toutes les métadonnées de classes et d’interfaces

J’ai créé avec succès le projet d’extension Visual Studio. Cela fonctionne bien et bien. J’ai fait un événement pour des solutions.

Les manuels dans MSDN et Internet sont brefs. Et je ne trouve pas de réponse à ma question: Comment puis-je récupérer toutes les métadonnées liées à la classe et aux interfaces (espaces de noms, noms de classe, types de base, etc.) dans la solution où ce paquet d’extension est installé?

Vous pouvez utiliser ITypeDiscoveryService pour répertorier tous les types disponibles dans le projet.

Pour ce faire, vous devez append une référence Microsoft.VisualStudio.Shell.Design au projet. De cette façon, vous pouvez utiliser DynamicTypeService pour obtenir une instance de ITypeDiscoveryService .

Ajoutez ces méthodes à votre classe Package :

 public List GetAllTypes() { var trs = GetTypeDiscoveryService(); var types = trs.GetTypes(typeof(object), true /*excludeGlobalTypes*/); var result = new List(); foreach (Type type in types) { if (type.IsPublic) { if (!result.Contains(type)) result.Add(type); } } return result; } private ITypeDiscoveryService GetTypeDiscoveryService() { var dte = GetService(); var typeService = GetService(); var solution = GetService(); IVsHierarchy hier; var projects = dte.ActiveSolutionProjects as Array; var currentProject = projects.GetValue(0) as Project; solution.GetProjectOfUniqueName(currentProject.UniqueName, out hier); return typeService.GetTypeDiscoveryService(hier); } private T GetService() { return (T)GetService(typeof(T)); } 

Ensuite, vous pouvez utiliser GetAllTypes pour obtenir tous les types de projets actifs:

 List types= GetAllTypes(); 

Ce code concerne les espaces de noms, mais vous pouvez facilement le transformer en prenant tout ce qui se trouve dans CodeModel:

 public class Metadata { public List ExtractNamespaces() { var namespaces = new List(); var service = (DTE)Package.GetGlobalService(typeof(SDTE)); var projects = service.Solution.Projects; foreach (Project project in projects) { var projectItems = GetProjectItemsRecursively(project.ProjectItems); foreach (ProjectItem item in projectItems.Where(i => i.FileCodeModel != null)) { foreach (CodeElement elem in item.FileCodeModel.CodeElements) { namespaces.AddRange(GetNamespacesRecursive(elem).Select(n=>new Namespace(n))); } } } return namespaces.Distinct().OrderBy(n=>n.ToSsortingng()).ToList(); } private static List GetNamespacesRecursive(CodeElement elem) { var namespaces = new List(); if (IsNamespaceable(elem.Kind) && IsEmptyNamespace(elem)) { namespaces.Add(ssortingng.Empty); } if (elem.Kind == vsCMElement.vsCMElementNamespace && !namespaces.Contains(elem.FullName)) { namespaces.Add(elem.FullName); if (elem.Children != null) { foreach (CodeElement codeElement in elem.Children) { var ns = GetNamespacesRecursive(codeElement); if (ns.Count > 0) namespaces.AddRange(ns); } } } return namespaces; } private static bool IsEmptyNamespace(CodeElement elem) { return elem.FullName.IndexOf('.') < 0; } private static bool IsNamespaceable(vsCMElement kind) { return (kind == vsCMElement.vsCMElementClass || kind == vsCMElement.vsCMElementEnum || kind == vsCMElement.vsCMElementInterface || kind == vsCMElement.vsCMElementStruct); } private static List GetProjectItemsRecursively(ProjectItems items) { var ret = new List(); if (items == null) return ret; foreach (ProjectItem item in items) { ret.Add(item); ret.AddRange(GetProjectItemsRecursively(item.ProjectItems)); } return ret; } }