Wie bekomme ich ein IL-Bytearray von einer DynamicMethod?

8

Als ein kleines Novum versuche ich zu sehen, wie unterschiedlich die IL von leichtem Code, der zur Laufzeit erzeugt wird, gegen den vom VS-Compiler erzeugten Code aussieht, da ich festgestellt habe, dass VS-Code mit einem anderen Leistungsprofil läuft für Dinge wie Guss.

Also habe ich den folgenden Code geschrieben:

%Vor%

Leider löst dies eine Ausnahme aus, da GetMethodBody anscheinend eine unzulässige Operation für Code ist, der von Ausdrucksbäumen generiert wird. Wie kann ich in einer Bibliotheksart (d. H. Nicht mit einem externen Tool, es sei denn, das Tool verfügt über eine API) den Code anzeigen, der mit Hilfe von Lightweight Codegen generiert wurde?

Bearbeiten: Der Fehler tritt in Zeile 5 auf, compiled.Method.GetMethodBody () löst die Ausnahme aus.

Bearbeiten2: Kann jemand die in der Methode deklarierten lokalen Variablen wiederherstellen? Oder gibt es keine Möglichkeit zu GetVariables?

    
Michael B 10.11.2010, 16:55
quelle

4 Antworten

16

Ja, funktioniert nicht, die Methode wird von Reflection.Emit generiert. Die IL wird im ILGenerator des MethodBuilder gespeichert. Du kannst es ausgraben, aber du musst ziemlich verzweifelt sein. Um zu den internen und privaten Mitgliedern zu gelangen, bedarf es einer Reflexion. Dies funktionierte auf .NET 3.5SP1:

%Vor%

Unter .NET 4.0 müssen Sie ilgen.GetType (). BaseType.GetField (...) verwenden, weil der IL-Generator geändert wurde, DynamicILGenerator, abgeleitet von ILGenerator.

    
Hans Passant 10.11.2010, 17:20
quelle
1

Der ILReader hear sollte funktionieren.

ILVisualizer 2010 Lösung

Ссылка

    
AbdelRaheim 20.02.2012 19:20
quelle
0

Basierend auf Hans Passants Arbeit konnte ich etwas tiefer graben, es scheint eine Methode zu geben, die Sie aufrufen sollten, genannt BakeByteArray , so dass das Folgende funktioniert:

%Vor%

Das hilft sicherlich, aber ich habe noch immer keine Möglichkeit, VariableInfo's aufzulösen, was mir bei meiner Arbeit helfen würde.

    
Michael B 10.11.2010 18:45
quelle
0

Die aktuellen Lösungen hier adressieren die aktuelle Situation in .NET 4 nicht sehr gut. Sie können entweder DynamicILInfo oder ILGenerator verwenden, um die dynamische Methode zu erstellen, aber die hier aufgelisteten Lösungen funktionieren nicht mit DynamicILInfo dynamischen Methoden überhaupt .

Unabhängig davon, ob Sie die Methode DynamicILInfo zum Generieren von IL oder die Methode ILGenerator verwenden, endet der IL-Bytecode in DynamicMethod.m_resolver.m_code . Sie müssen nicht beide Methoden überprüfen und es ist eine weniger komplexe Lösung.

Dies ist die Version, die Sie verwenden sollten:

%Vor%

In dieser Antwort finden Sie weitere Hilfsmethoden und eine Lösung für das Tokenauflösungsproblem von DynamicMethod.

    
jnm2 29.02.2016 23:03
quelle

Tags und Links