2009-09-11 3 views
24

Je voudrais analyser un nom qualifié d'assembly dans .NET 3.5. En particulier, l'ensemble lui-même n'est pas disponible, c'est juste le nom. Je peux penser à plusieurs façons de le faire à la main mais je suppose que je pourrais manquer quelque fonctionnalité pour le faire dans les bibliothèques du système. Toute suggestion?Nom qualifié de l'assembly d'analyse?

+1

Qu'est-ce qu'un assemblage? – Kieveli

+3

Je fais référence aux assemblages .NET ici. –

Répondre

18

La classe AssemblyName peut analyser le nom de l'assembly pour vous, il suffit de transmettre la chaîne à son constructeur. Si vous avez un nom de type qualifié pour l'assemblage, je pense que vous devrez d'abord enlever la partie type de la chaîne (c'est-à-dire tout jusqu'à la première virgule).

+4

Enlever le nom est généralement très complexe. Considérez même simple Tuple : "System.Tuple'2 [[System.Int32, mscorlib, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089]], mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 " – Yurik

+7

Le constructeur AssemblyName lève FileLoadException à moins qu'il ne soit en mesure de charger l'assembly –

-1

Consultez la classe Path. Il a un tas de fonctions d'analyse pour les noms de fichiers. Ou vous pouvez essayer:

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

Vous avez donc quelque chose comme ça?

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

Si vous cherchez à analyser la forme BNF, l'exemple ci-dessus à l'aide GetType devrait travailler pour vous.

EDIT: Ok, cela devrait faire ce que vous voulez en supposant que vous avez le nom:

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 lui-même n'est pas disponible, donc je ne peux pas opter pour un Type.GetType. –

+0

Donc, juste le nom de l'ensemble de la chaîne? Pouvez-vous poster ce que vous avez réellement? – SwDevMan81

-1

Si le montage est chargée, vous pouvez utiliser quelque chose comme ça:

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

Dans l'exemple ci-dessus je un assembly en cours d'exécution mais vous faites une boucle dans votre assembly chargé.

Mise à jour: Vous pouvez toujours charger un assemblage dans un séparé AppDomain obtenir le nom d'assemblage et une fois que vous avez terminé, décharger. Dites-moi si vous avez besoin d'un échantillon.

+0

Eh bien, précisément, je n'ai pas l'assemblage à portée de main. Je voudrais analyser la chaîne représentant son nom. –

+0

@Joannes, voir la partie mise à jour dans la réponse. – Vadim

4

De .Net 4 et vous avez une nouvelle dérogation pour Type.GetType:

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

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

Ce que vous devez faire est dans l'exemple de la documentation ci-dessus:

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

Vous pouvez remplacer les lambdas ci-dessus par des fonctions plus complexes.

Questions connexes