Ich arbeite an einem Projekt, wo wir die Racket-Sprache zu .NET mit DLR portieren.Statisch verknüpfen und kompilieren Runtime w/compilettoMethod() Ausdrucksbaum
Wir bauen einen Ausdrucksbaum nach oben und rufen die CompileToMethod()
Methode:
Relevant ausführbaren Emissionscode (aus How to Save an Expression Tree as the Main Entry Point to a New Executable Disk File?)
//Wrap the program into a block expression
Expression code = Expression.Block(new ParameterExpression[] { env, voidSingleton}, program);
var asmName = new AssemblyName("Foo");
var asmBuilder = AssemblyBuilder.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = asmBuilder.DefineDynamicModule("Foo", "Foo.exe");
var typeBuilder = moduleBuilder.DefineType("Program", TypeAttributes.Public);
var methodBuilder = typeBuilder.DefineMethod("Main",
MethodAttributes.Static, typeof(void), new[] { typeof(string) });
Expression.Lambda<Action>(code).CompileToMethod(methodBuilder);
typeBuilder.CreateType();
asmBuilder.SetEntryPoint(methodBuilder);
asmBuilder.Save("Foo.exe");
wir unsere Laufzeitbibliothek Runtime_rkt.dll
haben, die entsprechenden Laufzeittypkonvertierungen enthält, Hintergrundobjekte usw.
Wenn wir Foo.exe
und Runtime_rkt.dll
im selben Verzeichnis platzieren, funktioniert alles einwandfrei. Das Problem, das wir haben, ist, wenn wir (offensichtlich) die Laufzeitbibliothek woanders hin verschieben. Letztendlich werden wir es in C:\Windows\Microsoft.NET\assembly\GAC_MSIL
wie IronPython installieren möchten. [Gelöst mit GAC]
[Bearbeiten] Neue Frage für Extrapunkte Gibt es eine Möglichkeit, wie wir alle Laufzeitmethoden in die ausführbare Datei statisch kompilieren können?
Ich denke, wenn Sie [fügen Sie es in den GAC richtig] (http://msdn.microsoft.com/en-us/library/dkkx7f79) (nicht nur in das Verzeichnis kopieren), sollte es funktionieren . – svick
Viel Glück. Aber Expression erzeugt generell eher Mist-Code :(Wenn ich IronScheme nochmal machen müsste, würde ich statt des DLR die CCI verwenden. – leppie
@leppie Das wollte ich nicht hören :(. Es ist etwas spät für uns, auf CCI umzusteigen auch, aber danke für diese Info, wenn wir uns jemals dazu entscheiden, das wieder zu tun. –