[英]Running a mini-program in Mono.Csharp
我正在嘗試編寫一個交互式C#教學應用程序,用戶可以在其中試驗/更改代碼示例,看看會發生什么(有點像jsfiddle)。
我發現很多小型表達式或類似REPL的Mono.Csharp用作運行時編譯器的例子,但是我找不到一個執行“迷你程序”的例子。
這是我到目前為止的玩具代碼(MVC動作)。 “code”參數直接從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'
我錯過了什么?
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);
雖然這個問題已被接受,但當我遇到這個帖子時,我遇到了類似的問題。 我終於明白了,所以我想我會發布在這里以防其他人遇到麻煩。
您不能在與Evaluator
相同的調用中using
's和其他語句混合using
。 從Mono.CSharp REPL上的文檔 :
using聲明必須單獨出現,不能與單行中的常規語句混合使用。
由於這是對每行使用單獨的Evaluator
調用,因此同樣的限制適用於從應用程序調用Evaluator
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.