8

私はインタラクティブなC#教育アプリを作成しようとしています。このアプリでは、ユーザーがコード例を実験/変更して、何が起こるかを確認できます(jsfiddleのようなもの)。

小さな式やREPLのようなMono.Csharpのランタイムコンパイラとしての使用例をたくさん見つけましたが、「ミニプログラム」が実行される例はまったく見つかりません。

これが私のこれまでのおもちゃのコードです(MVCアクション)。「コード」パラメータは、テキストエリアから直接投稿されます。

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

私は何が欠けていますか?

4

2 に答える 2

8
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);
于 2012-09-30T17:47:16.280 に答える
2

この質問はすでに受け入れられていますが、この投稿に出くわしたとき、私は同様の問題を抱えていました。私はついにそれを理解したので、他の誰かがトラブルに遭遇した場合に備えてここに投稿すると思いました.

usingへの同じ呼び出しで、 のステートメントと他のステートメントを混在させることはできませんEvaluator。Mono.CSharp REPLのドキュメントから:

using 宣言は単独で記述する必要があり、通常のステートメントと 1 行で混在させることはできません。

Evaluatorこれは各行に対して個別の呼び出しを使用しているためEvaluator、アプリケーションからの呼び出しにも同じ制限が適用されます。

于 2012-11-24T07:35:55.933 に答える