Reflection.Emit konstantes Object auf den Stack laden
-
Hallo zusammen.
Ich bin dabei, ein Taschenrechnerprogramm zu programmieren. Dieses soll auch Userdefinierte Funktionen verwenden können (ähnlich dem Voyage 200 und anderen). Ich möchte also zur Laufzeit aus den Eingaben des Users eine Funktion erstellen, via System.Reflection.Emit (Mit dem ILGenerator). Es ist dass erste mal dass ich damit was mache und habe einige Schwierigkeiten.
Nach meinem momentanen Erkenntnisstand kann ich mitilGenerator.Emit(Opcodes.lcd_I4, 15);
ein Int32 mit Wert 15 auf den Stack laden. Da mein Taschenrechner auch mal mit eigenen Datentypen (z.B. komplexen Zahlen) rechnen können soll, möchte ich dasselbe mit einem System.Object machen, also:
Object o = new Complex(2, -1); ilGenerator.Emit("opcode um Object zu laden", o);
Das funktioniert aber nicht. Weder habe ich den geeigneten OpCode gefunden, noch existiert eine Emit-Überladung, die System.Object als zweites Argument akzeptiert.
Ich hab die letzten zwei Abende mit googeln verbracht, fand die Lösung aber leider nicht. Nun hoffe ich auf euch
Ich erwarte keine fertigen Lösungen. Alles, was mich irgendwie in die richtige Richtung weiterbringen können ist herzlich erwünscht.mfg ArgusMagnus
-
Ich weiß zwar nicht die Lösung deines Problems, aber das ganze würde mit Hilfe von ExpressionTrees etwas einfacher und auch flexibler gehen
Edits: url-tag versemmelt
-
hmm, kann man diese "ExpressionTrees" auch in Assemblies abspeichern? Ähnlich wie bei mittels Reflection generierten Typen und Methoden?
-
Die serialisiert man: http://code.msdn.microsoft.com/exprserialization
-
Falls irgendwie möglich, möchte ich dass mit Reflection.Emit machen. Was ich bis jetzt gelesen habe, passen die Möglichkeiten besser zu meinen Vorstellungen
Die ExpressionTrees sehen aber auf jeden Fall interessant aus.
Falls also doch noch ein Experte auf dem Gebiet der IL-Erzeugung auftaucht, ich wäre dankbar für Hilfe.mfg
-
Argus Magnus schrieb:
Falls irgendwie möglich, möchte ich dass mit Reflection.Emit machen. Was ich bis jetzt gelesen habe, passen die Möglichkeiten besser zu meinen Vorstellungen
Darf ich fragen, wie du auf diese Idee kommst? Was du bisher hier geschrieben hast, passen ExpressionTrees deutlich besser zu deinen Vorstellung. Codegenerierung zur Laufzeit ist eine sehr mühsame und komplizierte Sache. Wenn man darum einen Bogen machen kann, dann sollte man dies auch tun.
Wenn du es dennoch versuchen möchtest, dann musst du dich wohl oder übel in CIL (Common Intermediate Language) einarbeiten. Weitere Informationen findest du hier:
http://msdn.microsoft.com/en-us/netframework/aa569283.aspxBzw. im ECMA-335 Standard, auf welchen im vorherigen Link auch verwiesen wird:
http://www.ecma-international.org/publications/standards/Ecma-335.htmGrüssli
-
Danke, werde mir die Links anschauen.
Ich habe 2 Gründe, wieso ich es so machen will.
1. Möchte ich, wie schon geschrieben, die Funktion "speichern", also mittels eines ebenfalls dynamisch generierten Typen in einem Assembly abspeichern können. (Dass ist mit ExpressionTrees nicht möglich, oder?)Λ Und
2. interessiert mich dieses Thema und ich möchte das lernen. Und dass werde ich nie, wenn ich immer einen Bogen darum mache.
-
Argus Magnus schrieb:
Möchte ich, wie schon geschrieben, die Funktion "speichern", also mittels eines ebenfalls dynamisch generierten Typen in einem Assembly abspeichern können. (Dass ist mit ExpressionTrees nicht möglich, oder?)
Dann frage ich mal anders rum:
Wieso willst du es unbedingt in einer Assembly speichern? Wieso willst du es direkt als Code abspeichern? Das ist es, was mir nicht einleuchtet. Wenn es nur wegen der Übung ist, dann ok, aber es scheint, als wenn du noch andere Gründe hättest.Grüssli
-
Übung ist im Moment noch der Hauptgrund. Die anderen Gründe, die ich dafür hatte, werden zunehmends schwächer, bzw. es liesse sich sicherlich auch mittels ExpressionsTrees-Serialisierung bewerkstelligen. Mich interessiert das "Code zur Laufzeit erstellen" schon länger. Leider habe ich bis jetzt kein anständiges Tutorial gefunden, dass über die MSDN-Beispiele hinausgeht. Falls ich eins Finde, werd ich es hier posten.
mfg
-
Dann wäre vielleicht noch ein Hinweis auf Ildasm und Ilasm gut, sofern du diese noch nicht selbst gefunden hast.
Ansonsten such am besten die Blogs bei der MSDN ab, da gibt es sicher ein paar "Spinner", welche sich schon in dem Umfeld betätigt haben
Grüssli
-
Danke, dass Tool ist ja genial. Das Hilft mir wirklich weiter, danke! (Ist absolut ernst gemeint, bitte keinen Sarkasmus hineininterpretieren)