Was sind dynamische Methoden und wie unterscheidet sich DynamicMethod von MethodBuilder?

8

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.

    
Noldorin 18.03.2012, 04:27
quelle

1 Antwort

9

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 Objekt DynamicMethod 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.

    
svick 18.03.2012 11:01
quelle