2012-09-28 47 views
6

我正在嘗試編寫一個交互式C#教學應用程序,用戶可以在其中嘗試/更改代碼示例並查看發生了什麼(有點像jsfiddle)。在Mono.Csharp上運行一個小程序

我發現很多小表達式或者Mono.Csharp作爲運行時編譯器的REPL-like用法的例子,但我無法完全找到一個執行「小程序」的例子。

這是我的玩具代碼到目前爲止(一個MVC行動)。 「代碼」參數直接從textarea發佈。

[HttpPost] 
public ActionResult Index(string code) 
{ 
    var reportWriter = new StringWriter(); 
    var settings = new CompilerSettings(); 
    var printer = new ConsoleReportPrinter(reportWriter); 
    var reports = new Report(printer); 
    var eval = new Evaluator(settings, reports); 

    var model = new CodeViewModel(); 
    model.Code = code; 
    eval.Run(code); 
    model.Result = reportWriter.ToString(); 

    return View("Index", model); 
} 

現在假設代碼是這樣的一個字符串:

using System; 
public class MyClass 
{ 
    public void DoSomething() 
    { 
     Console.WriteLine("hello from DoSomething!"); 
    } 
} 

如何引導這個(即實例化一個MyClass對象,並對其調用DoSomething)?我試過只是附加new MyClass().DoSomething();到最後,但我得到這個:

{interactive}(1,2): warning CS0105: The using directive for `System' appeared previously in this namespace 
{interactive}(1,8): (Location of the symbol related to previous warning) 
{interactive}(11,1): error CS1530: Keyword `new' is not allowed on namespace elements 
{interactive}(11,4): error CS1525: Unexpected symbol `MyClass', expecting `class', `delegate', `enum', `interface', `partial', or `struct' 

我缺少什麼?

+1

你可以發佈包含MyClass類的整個文件嗎? –

+0

MyClass代碼不在文件中,它在字符串中。 –

回答

5
var reportWriter = new StringWriter(); 
var settings = new CompilerSettings(); 
var printer = new ConsoleReportPrinter(reportWriter); 
var reports = new Report(printer); 
var eval = new Evaluator(settings, reports); 

eval.Run(code); 

eval.Run(@" 
    var output = new System.IO.StringWriter(); 
    Console.SetOut(output); 
    new MyClass().DoSomething();"); 

var model = new CodeViewModel(); 
model.Code = code; 

if (reports.Errors > 0) 
    model.Result = reportWriter.ToString(); 
else 
    model.Result = (string) eval.Evaluate("output.ToString();"); 

return View("Index", model); 
1

雖然這個問題已被接受,但當我碰到這篇文章時,我遇到了類似的問題。我終於明白了,所以我想我會在這裏發帖,以防別人遇到麻煩。

您不能將using和其他語句與Evaluator在同一個調用中混合使用。從the documentation在Mono.CSharp REPL:

的使用聲明必須出現在自己,不能用在單行定期報表中混合。

由於這是一個使用到Evaluator每一行單獨通話,這同樣限制適用於從應用程序中調用Evaluator