2013-02-20 20 views
5

Ho bisogno di "scansionare" l'AppDomain attivo per tutti gli assembly caricati in fase di esecuzione e ottenere un elenco di spazi dei nomi univoci disponibili in quegli assembly, .NET lo supporta?Ottenere un elenco di tutti gli spazi dei nomi disponibili in un AppDomain

Il codice deve essere eseguito durante il periodo di esecuzione, in modo che il codice sia dinamico.

Ho appena iniziato la codifica in C#, quindi sono un po 'incerto su dove iniziare, quindi ogni aiuto sarà apprezzato.

+0

Se hai appena iniziato ad imparare C#, salva la riflessione e altre cose avanzate per dopo. La mia opinione, naturalmente. – gdoron

+0

Ho lavorato con c/C++ e assembly negli ultimi 20 anni, quindi non sono un noob completo, devo iniziare da qualche parte :) – jjdev80

risposta

2

un dato di fatto ho scritto un codice che ti permette di farlo un paio di giorni fa.

utilizzare questa classe:

public class NSScanner 
    { 
     public static List<Type> GetLoadedTypes(AppDomain appDomain) 
     { 
      return _getLoadedTypes(appDomain); 
     } 

     public static List<Type> GetPublicLoadedTypes(AppDomain appDomain) 
     { 
      return _getLoadedTypes(appDomain, true); 
     } 

     public static List<string> GetUniqueNamespaces(IEnumerable<Type> types) 
     { 
      var uniqueNamespaces = new ConcurrentBag<string>(); 

      Parallel.ForEach(types, type => 
      { 
       if (!uniqueNamespaces.Contains(type.Namespace) && !string.IsNullOrEmpty(type.Namespace)) 
        uniqueNamespaces.Add(type.Namespace); 
      }); 

      var sortedList = uniqueNamespaces.OrderBy(o => o).ToList(); 

      return sortedList; 
     } 


     private static List<Type> _getLoadedTypes(AppDomain appDomain, bool onlyPublicTypes = false) 
     { 
      var loadedAssemblies = appDomain.GetAssemblies(); 

      var loadedTypes = new List<Type>(); 

      Parallel.ForEach(loadedAssemblies, asm => 
      { 
       Type[] asmTypes; 
       if (onlyPublicTypes) 
        asmTypes = asm.GetExportedTypes(); 
       else 
        asmTypes = asm.GetTypes(); 

       loadedTypes.AddRange(asmTypes); 
      }); 

      return loadedTypes; 
     } 
    } 

Uso:

var publicLoadedTypes = NSScanner.GetPublicLoadedTypes(AppDomain.CurrentDomain); 
var namespaces = NSScanner.GetUniqueNamespaces(publicLoadedTypes); 

Enjoy!

+0

Questo è esattamente ciò di cui ho bisogno, grazie! – jjdev80

4

Inizia da un AppDomain (AppDomain.CurrentDomain forse) e chiama GetAssemblies. Su ciascun gruppo iterare il types definisce, traccia mantenendo cui namespace ognuno è nella

Come esempio di come sia facile farlo con LINQ considerare questo:.

var namespaces = AppDomain.CurrentDomain 
        .GetAssemblies() 
        .SelectMany(a => a.GetTypes()) 
        .Select(t => t.Namespace) 
        .Distinct() 
        // optionally .OrderBy(ns => ns) here to get sorted results 
        .ToList(); 
+0

grazie vm :) – jjdev80

Problemi correlati