Frage

Ich versuche, mein eigenes Spielzeug Meiner Spielzeug-Sprache zu schreiben -> MSIL-Compiler, um ein besseres Verständnis davon, wie Compiler Arbeit zu bekommen. Ich habe das Parsen und lexing arbeiten, habe ich die Ausdrucksbäume gebaut und die System.Linq.Expressions Ausdrucksbaum-API, ich habe einen Arbeits Dolmetscher. Nun möchte Ich mag einige echte MSIL Baugruppen emittieren.

Das Problem ist, ich kann nicht herausfinden, wie man tatsächlich diese Baugruppen zu bauen. Die Method Klasse akzeptiert nur roh MSIL Methodenrümpfe , so muss ich den rohen MSIL meines Ausdrucksbaum erhalten. Aufruf Expression.Compile () eine Arbeits Delegat gibt, aber ich bin nicht Lage der ihr zugrunde liegenden MSIL zu bekommen. Aufruf MethodInfo.GetMethodBody () löst eine InvalidOperationException da ist es nicht in dieser speziellen Kind-Klasse implementiert.

Wie kann ich einen Link, dass die Delegierten in eine neue Montage?

War es hilfreich?

Lösung

fand es einfach. Die DLR-Version von Lambda stellt eine CompileToMethod Methode, die genau das tut, was ich brauche.

lambdaExpression.CompileToMethod(myMethodBuilder);

Andere Tipps

Um roh IL auszusenden Sie benötigen, um Ihren eigenen AST zu definieren. Sie müssen dann Assemblymodule und dann können Sie festlegen, auf Modulebene Methode oder erhalten neue Typebuilder und jetzt Method definieren Klasse-Level-Methode.

Get

Sie haben gesagt, dass Sie bereits Lexer und Parser haben. das bedeutet, dass Sie in der Lage AST zu bauen. Also nur zu Fuß durch die analysierte Ausdrücke und emittieren Ihre IL.

Auch wenn Sie (von Compile) Code generieren erhalten werden Sie nicht in der Lage sein, etwas Nützliches damit zu tun, da generierten Code auf Infrastruktur abhängt. Wenn Sie zum Beispiel müssen Schließungen kompilieren, dann sollten Sie Klasse oder andere Speicher fo lexikalische Variablen erstellen und so weiter (wie nicht lexikalisch Steuerübertragung, die Ausnahmen in .net zu verwenden, erfordern)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top