2009-09-11 8 views
24

Chciałbym parsować kwalifikowaną nazwę zespołu w .NET 3.5. W szczególności, sam zespół nie jest dostępny, to tylko nazwa. Mogę wymyślić wiele sposobów robienia tego ręcznie ręcznie, ale myślę, że może brakować niektórych funkcji do tego w bibliotekach systemowych. Jakieś sugestie?Skopiuj nazwę kwalifikowaną złożenia?

+1

Co to jest montaż? – Kieveli

+3

Mam tutaj na myśli zestaw .NET. –

Odpowiedz

18

Klasa AssemblyName może przeanalizować nazwę zespołu dla ciebie, wystarczy przekazać ciąg do swojego konstruktora. Jeśli masz nazwę typu kwalifikowanego zespołu, myślę, że najpierw będziesz musiał usunąć część typu ciągu (tj. Wszystko aż do pierwszego przecinka).

+4

Usuwanie nazwy jest zwykle bardzo skomplikowane. Rozważ nawet prostą krotkę : "System.Tuple'2 [[System.Int32, mscorlib, Wersja = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Wersja = 4.0.0.0, Kultura = neutralny, PublicKeyToken = b77a5c561934e089]], mscorlib, wersja = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 " – Yurik

+7

AssemblyName konstruktor zgłasza wyjątek FileLoadException, chyba że jest w stanie załadować zespół –

-1

Sprawdź klasę Path. Ma kilka funkcji parsujących dla nazw plików. Albo można spróbować:

string qualType = @"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, publicKeyToken=b77a5c561934e089"; 
Type t = Type.GetType(qualType, false); 
if (t == null) 
{ 
    Console.WriteLine("Invalid qualified type string."); 
    return; 
} 
Console.WriteLine(t.FullName); 

Więc masz coś takiego?

Assembly assem = Assembly.LoadFile("PathToTheAssembly.dll"); 
Type t = assem.GetType("Namespace.And.Type.Name"); 
t.FullName 

Jeśli szukacie analizować formę BNF powyższy przykład przy użyciu GetType powinny pracować dla Ciebie.

EDIT: Ok, to powinien robić co chcesz zakładając, że masz nazwę:

Assembly assem = Assembly.GetAssembly(Type.GetType(assembly_qualified_name, false)); 
if(assem != null) 
{ 
    byte[] pkt = assem.GetName().GetPublicKeyToken(); 
    Version ver = assem.GetName().Version; 
    CultureInfo ci = assem.GetName().CultureInfo(); 
} 
+0

Sam zespół nie jest dostępny, więc nie mogę wybrać Type.GetType. –

+0

Więc tylko nazwa zespołu ciągów znaków? Czy możesz opublikować to, co faktycznie masz? – SwDevMan81

-1

Jeśli montaż załadowany można użyć coś takiego:

Assembly assembly = Assembly.GetExecutingAssembly(); 
    string assemblyName = assembly.GetName().Name; 

W powyższym przykładzie użyłem zespół wykonujący, ale przeglądasz załadowany zespół.

Aktualizacja: Zawsze można załadować zestawu w oddzielnym AppDomain uzyskać nazwę zespołu i po zakończeniu, rozładować go. Daj mi znać, jeśli potrzebujesz próbki.

+0

No właśnie, nie mam tego zestawu pod ręką. Chciałbym przeanalizować ciąg reprezentujący jego nazwę. –

+0

@Joannes, patrz część aktualizacji w odpowiedzi. – Vadim

4

Od .NET 4 i masz nowy nadpisanie dla Type.GetType:

public static Type GetType(
    string typeName, 
    Func<AssemblyName, Assembly> assemblyResolver, 
    Func<Assembly, string, bool, Type> typeResolver, 
    bool throwOnError, 
    bool ignoreCase 
) 

Zobacz http://msdn.microsoft.com/en-us/library/ee332784%28v=vs.100%29.aspx

Co trzeba zrób to w przykładzie powyższej dokumentacji:

Type t2 = Type.GetType(test, 
      (aName) => aName.Name == "MyAssembly" ? 
       Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : 
       Assembly.Load(aName), 
      (assem, name, ignore) => assem == null ? 
       Type.GetType(name, false, ignore) : 
       assem.GetType(name, false, ignore), true 
); 

Możesz zastąpić powyższe lambdy bardziej złożonymi funkcjami.

Powiązane problemy