2009-10-17 12 views
6

Potrzebuję metody, która pobiera typ i zwraca ścieżki wszystkich złożeń, które były używane w typie. pisałem tak:Uzyskiwanie ścieżek złożeń używanych w Type

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) 
{ 
yield return type.Assembly.Location; 

foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies()) 
{ 
    yield return Assembly.Load(assemblyName).Location; 
} 
} 

Generalnie ta metoda wykonać pracę, ale mają pewne wady:

  • nie znalazłem jak uzyskać odwołuje zespoły/ów samego typu, tak użyłem type.Assembly.GetReferencedAssemblies() i otrzymałem referencje całego zespołu, a nie tylko te związane z typem.

  • type.Assembly.GetReferencedAssembly() zwraca AssemblyName i nie ma właściwości location/path/filepath. Aby uzyskać właściwość lokalizacji, najpierw użyłem Assembly.Load(), a następnie użyłem właściwości location. Nie chcę, aby zespoły ładujące pobierały swoją ścieżkę, ponieważ nie są potrzebne, a ponieważ Assembly.Load() może zawieść z FileNotFoundException lub BadImageFormatException.

Odpowiedz

9

Myślę, że rozwiązałem problem Assembly.Load(), zamieniając go na Assembly.ReflectionOnlyLoad().

teraz to jest jak moja metoda wygląda następująco:

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) 
{   
    yield return type.Assembly.Location; 

    foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies()) 
    { 
     yield return Assembly.ReflectionOnlyLoad(assemblyName.FullName).Location; 
    } 
} 

teraz tylko lewy problemem jest type.Assembly.GetReferencedAssemblies(), jak mogę dostać zespoły odwołuje się od typu zamiast z zespołu?

+0

Wszystkie typy należą do złożeń - powinieneś być w stanie wykonać typ.Assembly.GetReferencedAssembly(). Och, czekaj, już to robisz. Zakładam, że to i tak długo jest rozwiązane, prawda? 2011? –

+0

@DxCK jakieś rozwiązanie dotyczące tego problemu? Mój problem: Projekt My Library odwołuje się do Oracle.DataAccess 4.112.2.0, ale w czasie wykonywania ładuje się z GAC Oracle.DataAccess 4.121.1.0. Assembly.GetReferencedAssembly() daje mi Oracle.DataAccess 4.112.2.0 nie Oracle.DataAccess 4.121.1.0. – Kiquenet

+0

Aby użyć, wywołaj 'var results = this.GetType(). GetReferencesAssembliesPaths();'. – Contango

2

type.Assembly.GetReferencedAssemblies() zwróci wszystkie zespoły, które odwołują się do montażu w których typ jest zadeklarowany. Nie oznacza to, że zespoły, które otrzymasz z tą funkcją mają coś wspólnego z danym typem.

+0

tak, to jest dokładnie jeden z moich problemów z tą metodą. – DxCK

+0

Problem dotyczący tego: projekt biblioteki odwołuje się do Oracle.DataAccess 4.112.2.0, ale w czasie wykonywania ładuje się z GAC Oracle.DataAccess 4.121.1.0. Assembly.GetReferencedAssembly() daje mi Oracle.DataAccess 4.112.2.0 nie Oracle.DataAccess 4.121.1.0. – Kiquenet