web-dev-qa-db-fra.com

Comment obtenir l'assembly (System.Reflection.Assembly) pour un type donné dans .Net?

Dans .Net, étant donné un nom de type, existe-t-il une méthode qui me dit dans quel assembly (instance de System.Reflection.Assembly) ce type est défini?

Je suppose que mon projet fait déjà référence à cette Assemblée, il suffit de savoir de laquelle il s'agit.

35
Fabio de Miranda

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

Si vous n'avez que le nom du type de base, vous devez faire quelque chose de plus 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é à la racine. Vous devez fournir l'espace de noms ou les types englobants dans le nom, ou effectuer une itération de la même manière.

37
jpj625
Assembly.GetAssembly(typeof(System.Int32))

Remplacer System.Int32 avec le type dont vous avez besoin. Parce qu'il accepte un paramètre Type, vous pouvez faire à peu près n'importe quoi de cette façon, par exemple:

string GetAssemblyLocationOfObject(object o) {
    return Assembly.GetAssembly(o.GetType()).Location;
}
33
Matthew Scharley

J'ai adapté la réponse acceptée à mes propres fins (en renvoyant l'objet Assembly au lieu du nom Assembly) et refactorisé le code pour 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.

3
MCattle
Type.GetType(typeNameString).Assembly
2
John Saunders

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

typeof(int).Assembly
0
Sam Harwell