Come ottenere l'assemblaggio (System.Reflection.Assembly) per un determinato tipo di Net?
-
16-09-2019 - |
Domanda
In Net, dato un nome del tipo, c'è un metodo che mi dice in cui il montaggio (istanza di System.Reflection.Assembly), che tipo è definito?
I supporre che il mio progetto ha già un riferimento a tale assemblea, solo bisogno di sapere quale sia.
Soluzione
Assembly.GetAssembly presuppone che un'istanza del tipo e Type.GetType presuppone che il nome di tipo completo, che include il nome di montaggio.
Se avete solo il nome del tipo di base, è necessario fare qualcosa di più simile a questo:
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";
}
Ciò presuppone anche il tipo viene dichiarato nella radice. Si avrebbe bisogno di fornire il tipo di spazio dei nomi o che racchiudono nel nome, o iterare nello stesso modo.
Altri suggerimenti
Assembly.GetAssembly(typeof(System.Int32))
Sostituire System.Int32
con qualsiasi tipo vi capita di bisogno. Perché accetta un parametro Type
, si può fare qualsiasi cosa in questo modo, per esempio:
string GetAssemblyLocationOfObject(object o) {
return Assembly.GetAssembly(o.GetType()).Location;
}
Ho adattato la risposta accettata per i miei scopi (ritorno l'oggetto assemblea al posto del nome di montaggio), e refactoring del codice per VB.NET e 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
Sto solo condividendo qui se qualcun altro vorrebbe una soluzione LINQy alla risposta accettata.
Type.GetType(typeNameString).Assembly
Se si può utilizzare, questa sintassi è la più breve / più pulita:
typeof(int).Assembly