2012-11-25 8 views
5

dachte ich heraus, dass ich nicht eine Script-Bibliothek von einem anderen leicht laden kann:Wie referenzierte Skriptbibliotheken aus einer Roslyn-Skriptdatei geladen werden?

module.csx

string SomeFunction() { 
    return "something"; 
} 

script.csx

ExecuteFile("module.csx"); 
SomeFunction() <-- causes compile error "SomeFunction" does not exist 

Dies ist, da der Compiler nicht von Modul nicht kennt. csx zu der Zeit kompiliert script.csx afaiu. Ich kann ein weiteres Skript hinzufügen, um die zwei Dateien von diesem zu laden, und das wird funktionieren. Aber das ist nicht so schön.

Stattdessen möchte ich meine Skripthost für eine spezielle Syntax "Modul laden" in meinen Skripts, und führen Sie diese Module vor der eigentlichen Skriptausführung.

script.csx

// load "module.csx" 
SomeFunction() 

nun mit einigen grundlegenden String-Handling, kann ich herausfinden, welche (Linien, die // Last enthält ...) zu laden Module und laden die Dateien (GIST hier https://gist.github.com/4147064) :

foreach(var module in scriptModules) { 
    session.ExecuteFile(module); 
} 
return session.Execute(script) 

Aber - da wir Roslyn sprechen, sollte es einige nette Art und Weise sein, das Skript für die Syntax zu analysieren, die ich suche, nicht wahr?

Und es könnte sogar eine Möglichkeit geben, Modulbibliotheken von Code zu behandeln?

+0

Eine erste Version der ganzen Sache: https://github.com/joeriks/RoslynWebScript – joeriks

Antwort

6

Momentan gibt es in Roslyn keine Möglichkeit, auf eine andere Skriptdatei zu verweisen. Wir erwägen, von einem Host-Befehl des interaktiven Fensters zu einem Teil der Sprache (wie #r) zu verschieben, aber es ist derzeit nicht implementiert.

Wie Sie mit den Strings umgehen können, könnten Sie es normalerweise analysieren und dann nach Präprozessor-Direktiven suchen, die von einem unbekannten Typ sind und sich so in die Struktur vertiefen.

+0

Danke, also werde ich den Syntaxbaum für meine o analysieren wn Direktive (zum Beispiel #load), und dann eine neue Struktur ohne diese Direktive (n) erstellen und die neue Struktur ausführen? Oder sollte ich besser Compilation.Create ... anstelle von Scripting Execute verwenden? – joeriks

+0

Das Umschreiben des Baums und das anschließende Ausführen von Execute klingt wie ein vernünftiger Plan. –

4

Unterstützung für in Skriptdateien wurde ab https://github.com/dotnet/roslyn/commit/f1702c hinzugefügt.

#load "common.csx" 
... 

und konfigurieren Sie die Quelle Resolver wenn Sie die Skripte ausführen:

wird diese Funktionalität in Visual Studio 2015 Update 1.

1

Fügen Sie das Skript zur Verfügung

Script<object> script = CSharpScript.Create(code, ...); 
var options = ScriptOptions.Default.WithSourceResolver(new SourceFileResolver(new string[] { }, baseDirectory)); 
var func = script.WithOptions(options).CreateDelegate() 
... 
Verwandte Themen