2012-03-30 5 views
2

Ich habe gerade ein Spiel mit Roslyn, bin aber unsicher, wie ich das Folgende machen soll.Laden eines Skripts aus einer CS-Datei und Zugriff auf Host-Methoden, Eigenschaften usw.?

diese einfach zu halten, können sagen, dass ich ein Host-Programm haben, die wie eine Methode hat so

public void DisplayMessage(string message) 
{ 
    MessageBox.Show(message); 
} 

Kann ich eine Skriptdatei dann haben MyScript.csx genannt und haben dann etwas irgendwo im Skript wie

void Main() 
{ 
    Host.DisplayMessage("I am a script"); 
} 

Dann habe ich den Host laden Sie die Datei und führen Sie es aus.

Wenn so etwas nicht möglich ist, gibt es ein Scriptsystem/eine Engine, die auf C# basiert? Dies sind die Anforderungen

  1. Host-Anwendung kann Skript aus einer Datei laden.
  2. Script-Datei wird in C# geschrieben und kann so geschrieben werden VS2010 mit mit Syntax etc
  3. Script-Datei Host öffentliche Methoden zugreifen können, Eigenschaften usw.

Antwort

1

Ja, können Sie tun, was Sie Roslyn wollen verwenden.

Erstellen Sie zuerst eine öffentliche Host Klasse mit einer öffentlichen DisplayMessage-Methode (oder verwenden Sie eine vorhandene Klasse). Erstellen Sie dann ScriptEngine und geben Sie die Baugruppe an, die Host als Referenz enthält. Danach können Sie ExecuteFile() auf die Dateien, mit dem Host Objekt als ein anderer Parameter nennen:

var engine = new ScriptEngine(references: new[] { typeof(Host).Assembly }); 
engine.ExecuteFile("MyScript.csx", new Host()); 

Die Script-Dateien keine Main() Methode benötigt, und die Methode auf dem Host-Objekt direkt aufrufen:

DisplayMessage("I am a script"); 
+0

Cool, ich werde es versuchen – Gaz83

+0

Ok @svick nur schreiben DisplayMessage ("Ich bin ein Skript"); funktioniert nicht, also wie greifen Sie tatsächlich auf die Eigenschaften des Hosts zu? Ich habe versucht, #r "C: \ MyScriptTest.exe" (Assembly, die das Skript ausführt), an den Anfang des Skripts und führen Sie die folgenden TestApp.MainWindow.DisplayMessage ("Ich bin ein Skript"); Aber ich bekomme die "enthält keine Definition für 'DisplayMessage'" Fehler – Gaz83

+0

Sie müssen wirklich nicht in irgendeiner Weise verweisen, sollten Sie in der Lage sein, es einfach zu nennen, wie ich schrieb. Sind Sie sicher, dass Sie eine Instanz von 'Host' an die' ExecuteFile() 'Methode übergeben und dass die Methode, die Sie aufrufen wollen,' public' ist? – svick

2

Ich schrieb eine Introduction to the Roslyn scripting API, die das meiste abdeckt, was Sie fragen. Der ScriptEngine Typ hat auch eine ExecuteFile Methode, die für das, was Sie versuchen, nützlich sein würde.

Haftungsausschluss: Ich arbeite für Microsoft am Roslyn-Projekt.