Comment obtenir l'ensemble (System.Reflection.Assembly) pour un type donné en .Net?
-
16-09-2019 - |
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.
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