繁体   English   中英

在Mono.Csharp中运行一个迷你程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM