2009-07-17 5 views

Répondre

36

Assembly.GetAssembly suppose que vous avez une instance du type, et Type.GetType suppose que le nom complet du type qui comprend le nom de l'assembly.

Si vous avez seulement le nom du type de base, vous devez faire quelque chose comme ceci:

public static String GetAssemblyNameContainingType(String typeName) 
{ 
    foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     Type t = currentassembly.GetType(typeName, false, true); 
     if (t != null) {return currentassembly.FullName;} 
    } 

    return "not found"; 
} 

Cela suppose également que votre type est déclaré dans la racine. Vous devez fournir l'espace de noms ou les types englobants dans le nom, ou itérer de la même manière.

+0

Je lancerais probablement une ArgumentException dans le cas où il ne trouverait pas ce que vous cherchez. Vraisemblablement ce serait le cas exceptionnel, et alors vous pourriez aussi supposer que vous l'avez trouvé (ou mettre le code de gestion des erreurs dans une instruction catch) –

+0

MAIS, Assembly.GetAssembly n'a pas besoin d'une instance du type, il a seulement besoin du type, donc si vous cherchez quelque chose dont vous connaissez le type à la compilation, vous pouvez utiliser typeof (Type) comme dans mon premier exemple. –

+0

Merci pour les réponses, ça fonctionne comme un charme pour moi. Je n'avais pas le type, juste le nom du type et je savais qu'une référence à un assemblage le contenant était disponible. –

1
Type.GetType(typeNameString).Assembly 
+1

Cette méthode attend un nom qualifié pour l'assembly. Êtes-vous sûr que cela fonctionne à l'assemblage croisé si vous ne le qualifiez pas avec le nom de l'assembly? – chakrit

26
Assembly.GetAssembly(typeof(System.Int32)) 

Remplacer System.Int32 avec ce type que vous arrive d'avoir besoin. Parce qu'il accepte un paramètre Type, vous pouvez faire à peu près tout de cette façon, par exemple:

string GetAssemblyLocationOfObject(object o) { 
    return Assembly.GetAssembly(o.GetType()).Location; 
} 
+0

En tant que sidenote, j'utilise cette fonction exacte comme un moyen de remplir la liste ReferencedAssemblies lorsque vous utilisez CSharpCodeProvider pour compiler C# dynamiquement. –

+1

C'est un conseil utile, mais l'affiche d'origine n'a que le nom du type, pas l'instance Type. –

-1

Si vous pouvez l'utiliser, cette syntaxe est la plus courte/plus propre:

typeof(int).Assembly 
+1

Avez-vous même lu la question OPs avant de poster une réponse générique comme ça? L'OP n'a pas le type et seulement le nom de la chaîne. Cette réponse ignore complètement ce fait. –

+0

@JoshuaHayes Vous faites autant de suppositions que je l'ai fait. Lors de l'écriture de ma réponse générique, j'ai commencé avec juste un nom de type ('int') et j'ai écrit une expression pour obtenir l'assembly où ce type est défini. Pas une seule fois dans ce fil, le PO a dit qu'il avait le nom du type comme une chaîne. –

+0

Il l'a fait en réalité. Regardez la signature de la méthode (string typeName). L'OP a dit qu'il avait seulement le nom du type. D'où ma référence au nom du type de chaîne. –

2

J'ai adapté la réponse acceptée pour mes propres fins (retourner l'objet de montage au lieu du nom d'assemblage) et refactorisé le code de VB.NET et LINQ:

Public Function GetAssemblyForType(typeName As String) As Assembly 
    Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing) 
End Function 

Je partage juste ici si quelqu'un d'autre voudrait une solution LINQy à la réponse acceptée.

Questions connexes