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.
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.
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;
}
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.
Type.GetType(typeNameString).Assembly
Si vous pouvez l'utiliser, cette syntaxe est la plus courte/la plus propre:
typeof(int).Assembly