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?
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.
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:
Das hilft sicherlich, aber ich habe noch immer keine Möglichkeit, VariableInfo's
aufzulösen, was mir bei meiner Arbeit helfen würde.
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.
Tags und Links c# dynamicmethod