Mono-Compiler als Dienst (MCS)

8

Ich möchte Monos Compiler als Service von meiner regulären .NET 3.5-Anwendung verwenden.

Ich habe die neuesten Bits (2.6.7) heruntergeladen, eine einfache Konsolenanwendung in Visual Studio erstellt und die Mono.CSharp-DLL referenziert.

Dann in meiner Konsolen-App (direkt aus einem Online-Beispiel):

%Vor%

Dies löst eine Ausnahme bei Evaluator.Run (die erste Zeile) aus:

%Vor%

Das liegt daran, dass die DLL mit Mono.exe und nicht mit csc.exe kompiliert wurde, glaube ich.

Ich habe versucht, die Mono.CSharp-dll direkt von Ссылка herunterzuladen. repl.zip file ... und das löst keine Ausnahme aus ... Allerdings ist der out-Parameter (res) nach dem Aufruf von Evaluator.Evaluate null ... also bin ich mir nicht sicher, was schief läuft. Es wird keine Ausnahme ausgelöst ...

Also würde ich gerne herausfinden, warum die DLL, die ich von der demo-repl.zip heruntergeladen habe, null zurückgibt.

EDIT: Ich habe herausgefunden, warum es null zurückgibt. Aus irgendeinem Grund scheint der Compiler den System.Linq-Namespace nicht aufzunehmen ... obwohl ich nicht sagen kann, warum ... Wenn ich nur "System.IO.Directory.GetFiles (\" C: \\ ")", es funktioniert gut.

UPDATE: Es scheint definitiv, dass etwas nicht stimmt mit dem Mono-Compiler, der referenzierte System-Assemblies aufnimmt. Wenn ich das Beispiel ihres csharp Konsolenwerkzeugs direkt kopiere:

%Vor%

Ich bekomme die Ausnahme:

%Vor%

Damit das MCS tatsächlich eine praktikable Lösung ist, muss ich den Compiler so modifizieren, dass er an eine einzige dynamische Assembly gesendet wird, anstatt eine Assembly pro Evaluierungsaufruf auszugeben (ansonsten wird ein größerer Speicher bereitgestellt) Leck, das ich zuvor in Form des CSharpCodeProviders behandelt habe). Hat jemand eine Vorstellung davon, wie schwierig das sein wird oder kann mir hier jemand in die richtige Richtung zeigen?

Danke.

    
Jeff 04.08.2010, 15:49
quelle

2 Antworten

2

Ok, ich denke ich habe ein paar Antworten.

Um das Problem beim Laden von Baugruppen zu lösen, kann ich entweder Assembly.LoadWithPartialName in Mono.CSharp.Driver.LoadAssembly aufrufen oder in meiner Anwendung Folgendes tun:

%Vor%

Damit Mono die gleiche dynamische Assembly für jeden Evaluate / Compile-Aufruf wiederverwenden kann, musste ich nur Folgendes ändern (obwohl es wahrscheinlich Komplexitäten gibt, die mir hier fehlen) .....

In Mono.CSharp.Evaluator habe ich die Eigenschaft hinzugefügt:

%Vor%

Dann ... stelle sicher, dass Reset mindestens einmal in Init:

aufgerufen wird %Vor%

Und schließlich, in ParseString, einfach nicht zurücksetzen, es sei denn, AutoReset ist wahr ...

%Vor%     
Jeff 04.08.2010, 21:19
quelle
1

Laut Miguels Blog-Seite, die Sie verlinkt haben, müssen Sie einen Verweis auf System.Core hinzufügen, um LINQ auf .Net zu verwenden.

%Vor%     
jpobst 04.08.2010 20:51
quelle