Question

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

Je suppose que mon projet a déjà une référence à cette assemblée, juste besoin de savoir qui il est.

Était-ce utile?

La solution

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

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 aussi votre type est déclarée dans la racine. Vous devrez fournir l'espace de noms ou types enserrant au nom, ou itérer de la même manière.

Autres conseils

Assembly.GetAssembly(typeof(System.Int32))

Remplacer System.Int32 avec quel type 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;
}

J'ai adapté la réponse acceptée pour mes propres fins (retour l'objet de montage au lieu du nom d'assemblage) et refactorisé le code 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 comme une solution LINQy à la réponse acceptée.

Type.GetType(typeNameString).Assembly

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

typeof(int).Assembly
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top