2009-09-11 11 views
24

Vorrei analizzare un nome qualificato dell'assembly in .NET 3.5. In particolare, l'assembly non è disponibile, è solo il nome. Posso pensare a molti modi di farlo a mano ma suppongo che potrebbe mancare qualche funzione per farlo nelle librerie di sistema. Qualche suggerimento?Nome qualificato dell'assemblaggio di analisi?

+1

Cos'è un assemblaggio? – Kieveli

+3

Mi riferisco agli assembly .NET qui. –

risposta

18

La classe AssemblyName può analizzare il nome dell'assembly per voi, basta passare la stringa al suo costruttore. Se si dispone di un nome di tipo qualificato dell'assieme, penso che sarà necessario prima rimuovere la parte del tipo della stringa (cioè tutto fino alla prima virgola).

+4

Spogliare il nome è solitamente molto complesso. Prendi in considerazione anche la semplice Tupla : "System.Tuple'2 [[System.Int32, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 4.0.0.0, Culture = neutro, PublicKeyToken = b77a5c561934e089]], mscorlib, versione = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 " – Yurik

+7

Il costruttore AssemblyName genera FileLoadException a meno che non sia in grado di caricare l'assembly –

-1

Scopri la classe Path. Ha un sacco di funzioni di analisi per i nomi dei file. Oppure si potrebbe provare:

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

in modo da avere qualcosa di simile?

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

Se siete alla ricerca per analizzare la forma BNF, l'esempio precedente utilizzando GetType dovrebbe funzionare per voi.

EDIT: Ok, questo dovrebbe fare quello che vuoi a patto di avere il nome:

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

L'assembly non è disponibile, quindi non posso andare su Type.GetType. –

+0

Quindi, solo il nome dell'assieme di stringhe? Puoi pubblicare ciò che effettivamente hai? – SwDevMan81

-1

Se il montaggio caricata si può usare qualcosa di simile:

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

Nell'esempio precedente ho usato un assembly in esecuzione ma si esegue il looping del gruppo caricato.

Aggiornamento: È sempre possibile caricare un assembly in un dominio di applicazione separata ottenere il nome di montaggio e dopo aver terminato, scaricarlo. Fammi sapere se hai bisogno di un campione.

+0

Beh, appunto, non ho l'assemblea a portata di mano. Vorrei analizzare la stringa che rappresenta il suo nome. –

+0

@Joannes, vedere aggiornamento parte nella risposta. – Vadim

4

Da .Net 4 e si dispone di una nuova override per Type.GetType:

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

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

Che cosa è necessario fare è nell'esempio della documentazione di cui sopra:

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

È possibile sostituire i lambda precedenti con funzioni più complesse.

Problemi correlati