【问题标题】:Running a mini-program in Mono.Csharp在 Mono.Csharp 中运行一个小程序
【发布时间】:2012-09-28 03:59:52
【问题描述】:

我正在尝试编写一个交互式 C# 教学应用程序,用户可以在其中试验/更改代码示例并查看会发生什么(有点像 jsfiddle)。

我找到了很多关于将 Mono.Csharp 用作运行时编译器的小表达式或类似 REPL 的使用示例,但我找不到执行“小程序”的示例。

到目前为止,这是我的玩具代码(一个 MVC 操作)。 “code”参数直接从文本区域发布。

[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'

我错过了什么?

【问题讨论】:

  • 你能发布包含 MyClass 类的整个文件吗?
  • MyClass 代码不在文件中,而是在字符串中。

标签: c# compiler-construction mono bootstrapping


【解决方案1】:
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);

【讨论】:

    【解决方案2】:

    虽然这个问题已经被接受,但当我看到这篇文章时,我遇到了类似的问题。我终于想通了,所以我想我会在这里发帖以防其他人遇到麻烦。

    您不能在对Evaluator 的同一调用中混合使用using 和其他语句。来自 Mono.CSharp REPL 上的 the documentation

    using 声明必须单独出现,不能与常规语句混合在一行中。

    由于这对每一行都使用了对Evaluator 的单独调用,因此同样的限制适用于从您的应用程序调用Evaluator

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 2015-12-10
      • 2010-12-08
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      相关资源
      最近更新 更多