2010-11-16 14 views
10

Jak uzyskać ścieżki wszystkich zestawów, do których odwołuje się aktualnie wykonywany zespół? GetReferencedAssmblies() daje mi AssemblyName[] s. Jak dotrzeć do miejsca, z którego zostały załadowane, od tego miejsca?Uzyskaj ścieżki wszystkich odwoływanych zespołów

+4

Spróbuj http://stackoverflow.com/questions/1582510/ get-pathes-of-assemblies-used-in-type –

+0

Wielkie dzięki. To rozwiązało to dla mnie. –

+0

Aby uzyskać w pełni działający przykład, jak uzyskać wszystkie odwołania do złożeń, rekurencyjnie, zobacz http://stackoverflow.com/questions/383686/how-do-you-loop-through-currently-loaded- assemblies/26300241#26300241. – Contango

Odpowiedz

12

Nie możesz wiedzieć, dopóki zespół jest załadowany. Algorytm montażu jest skomplikowany i nie można jednoznacznie odgadnąć, co zrobi. Wywołanie nadpisania Assembly.Load(AssemblyName) spowoduje wyświetlenie odniesienia do złożenia, a jego właściwość Położenie poinformuje, czego potrzebujesz.

Jednak naprawdę nie chce załadować zespoły z góry, przed kompilator JIT robi. Jest nieefektywny, a prawdopodobieństwo problemów nie wynosi zero. Możesz na przykład wywołać zdarzenie AppDomain.AssemblyResolve, zanim program będzie gotowy na odpowiedź. Unikaj zadawania tego pytania.

+0

Wielkie dzięki za właściwą odpowiedź. –

0

Właściwość CodeBase powinna podać pełną nazwę ścieżki.

+0

Czy próbowałeś? –

+5

Niestety, CodeBase zwraca null na każdym zespole referencyjnym. :-) –

0

Można uzyskać lokalizację URL zespołu tak:

Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase 
+1

CodeBase zwraca null. Rozwiązaniem jest post, z którym JasonEvans łączył się w swoim komentarzu do oryginalnego postu. Również Hans Passant ma właściwą odpowiedź. –

2

Po odpowiedzi Hansa Passanta, a ponieważ właściwość CodeBase zawsze zawierała null, wpadłem na to. Może nie znaleźć wszystkich złożeń, ponieważ mogą one nie być już załadowane. W mojej sytuacji, musiałem znaleźć wszystkie odniesienia do poprzednio załadowanego zespołu, więc to działa dobrze:

IEnumerable<string> GetAssemblyFiles(Assembly assembly) 
{ 
    var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
    foreach (var assemblyName in assembly.GetReferencedAssemblies()) 
     yield return loadedAssemblies.SingleOrDefault(a => a.FullName == assemblyName.FullName)?.Location; 
} 

Zastosowanie:

var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly); 
Powiązane problemy