2011-01-08 5 views

Antwort

0

Dazu müssen Sie zuerst die referenzierten Assemblys abrufen und dann die Gruppe der Namespaces von allen Typen in dieser Assembly abrufen.

AssemblyName[] referencedAssemblies = GetType().Assembly.GetReferencedAssemblies(); 
HashSet<string > namespaces = new HashSet<string>(); 

foreach (AssemblyName referencedAssembly in referencedAssemblies) 
{ 
    Assembly reference = Assembly.Load(referencedAssembly); 

    if (!reference.GlobalAssemblyCache) 
    { 
     HashSet<string> refernceNamespaces = new HashSet<string>(
      reference.GetTypes().Select(t => t.Namespace).Where(ns => ns != null)); 
     namespaces.UnionWith(refernceNamespaces); 
    } 
} 

Der obige Code ruft alle Namespaces in referenzierten Assemblys ab, die nicht im GAC enthalten sind. Wenn Sie nur die Namespaces in Ihren spezifischen Assemblys abrufen möchten, können Sie einfach die Eigenschaft AssemblyName.Name überprüfen, um sicherzustellen, dass Sie die richtigen Assemblys überprüfen.

+0

Sie müssen die Assemblys nicht neu laden - Sie können die tatsächliche Assembly-Instanz über AppDomain.CurrentDomain.GetAssemblies() abrufen – zebrabox

+0

Meinten Sie Excecutingassembly von GetType() in dieser ersten Codezeile? – user282807

+0

@zebarbox Sie könnten zwar, aber Aufruf 'Assembly.Load' auf einer bereits geladenen Baugruppe lädt keine weitere Kopie davon, es gibt nur die bereits geladene Baugruppe zurück. Da auf die Assembly trotzdem verwiesen wird, entsteht kein zusätzlicher Overhead. – adrianbanks

Verwandte Themen