Ich bin in der Reflexion über C # -Code auf dynamische Methoden gestoßen, und ich muss noch herausfinden, was genau sie sind. Es scheint spezifisch eine DynamicMethod
-Klasse zu sein, die die Erzeugung und Spezifikation von CLR-Methoden zur Laufzeit erlaubt. Aber dann gibt es auch die Klasse MethodBuilder
. Beide scheinen sehr ähnliche Dinge zu tun. Anscheinend sind "dynamische Assemblies" AssemblyBuilder
-Klassen und "dynamische Typen" sind TypeBuilder
-Klassen. Sie befinden sich in jedem Fall im Namensraum System.Reflection.Emit
.
MSDN scheint sehr wenig hochwertige Informationen zu diesem Thema zu haben. Wenn also jemand erklären könnte, was dynamische Methoden sind, wo genau alle XYZBuilder
-Klassen hier zum Einsatz kommen und wofür sie jeweils verwendet werden, wäre das großartig. Alle anderen Reflection.Emit-Typen und -Funktionen, die ich kennen sollte, wären ebenfalls willkommen.
Ich denke die Dokumentation für DynamicMethod
erklärt das gut :
Sie können die Klasse
DynamicMethod
verwenden, um eine Methode zur Laufzeit zu generieren und auszuführen, ohne eine dynamische Assembly und einen dynamischen Typ für die Methode generieren zu müssen. Der ausführbare Code, der vom JIT-Compiler erstellt wird, wird zurückgewonnen, wenn das ObjektDynamicMethod
zurückgewonnen wird. Dynamische Methoden sind die effizienteste Möglichkeit, kleine Mengen Code zu generieren und auszuführen.
Wenn Sie eine oder mehrere Methoden dynamisch erstellen müssen, verwenden Sie DynamicMethod
. Wenn Sie ganze Typen erstellen möchten, müssen Sie eine dynamische Assembly erstellen ( AssemblyBuilder
), dann ein Modul darin erstellen ( ModuleBuilder
) und dann einen oder mehrere Typen erstellen ( TypeBuilder
). Um Methoden innerhalb dieser Typen zu erstellen, würden Sie MethodBuilder
verwenden.
Ein weiterer Unterschied ist GC: DynamicMethod
s kann immer Müll gesammelt werden und sie werden eins nach dem anderen gesammelt. Das heißt, jede Methode kann gesammelt werden, sobald Sie sie nicht mehr verwenden. Dynamische Assemblys hingegen können nur gesammelt werden, wenn Sie sie angeben (indem Sie AssemblyBuilderAccess.RunAndCollect
) und sie werden immer von Assembly durch Assembly gesammelt. Wenn Sie beispielsweise zwei Typen in einer Baugruppe haben und nur eine davon verwenden, kann die andere nicht erfasst werden.
Tags und Links .net reflection clr reflection.emit dynamic-method