2013-02-20 9 views
5

Muszę "zeskanować" aktywne AppDomain dla wszystkich załadowanych zestawów w czasie wykonywania i uzyskać listę unikalnych przestrzeni nazw dostępnych w tych złożeniach, czy obsługa .NET to?Uzyskiwanie listy wszystkich dostępnych obszarów nazw w AppDomain

Kod musi zostać wykonany w czasie wykonywania, aby kod był dynamiczny.

Właśnie zacząłem kodowanie w C#, więc nie jestem pewien, od czego zacząć, więc każda pomoc będzie doceniona.

+0

Jeśli dopiero zacząłeś się uczyć C#, zapisz odbicie i inne zaawansowane rzeczy na później. Moje zdanie oczywiście. – gdoron

+0

Pracuję z c/C++ i montażem przez ostatnie 20 lat, więc nie jestem kompletnym noobem, muszę gdzieś zacząć :) – jjdev80

Odpowiedz

2

W gruncie Faktem jest, że napisałem kod, który pozwala to zrobić kilka dni temu.

Użyj tej klasy:

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; 
     } 
    } 

Wykorzystanie:

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

Enjoy!

+0

Dokładnie tego potrzebuję, dziękuję! – jjdev80

4

Być może zacznij od AppDomain (AppDomain.CurrentDomain) i zadzwoń pod numer GetAssemblies. Na każdym zespole iteracyjne nad types to określa, śledzenie który namespace każdy z nich jest w

Jako przykład, jak łatwo jest to zrobić z LINQ rozważ to:.

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

dziękuję vm :) – jjdev80