2014-03-18 16 views
6

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?

+1

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

+2

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

+0

@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. –

Antwort

0
  1. Nachdem Sie die Laufzeitbibliothek auf den GAC gestellt haben, sollte alles funktionieren, nicht wahr? Warum machst du es jetzt nicht? Versuchen
  2. erklären Sie sich, wie die eingebaute ausführbare wird die Laufzeitbibliothek mittlerweile
  3. Blick in ILMerge
  4. Blick in neue native Erstellung von .NET-Assemblies lokalisieren MS ist in diesem Jahr rollt. Es wird beworben, nicht nur auf nativen Code zu kompilieren, sondern auch alle Bibliotheken und CLR selbst in die exe-Datei aufzunehmen.
  5. Sie können das Ereignis AppDomain.AssemblyResolve immer abonnieren. Natürlich müssten Sie dieses Abonnement in Ihre generierte EXE-Datei kompilieren.
  6. Sie können Ordner konfigurieren, in denen CLR in der Konfigurationsdatei nach DLLs sucht.