2012-09-28 31 views
6

Tôi đang cố viết một ứng dụng dạy học C# tương tác, trong đó người dùng có thể thử nghiệm/thay đổi các ví dụ mã và xem điều gì xảy ra (kinda như jsfiddle).Chạy chương trình mini ở Mono.Csharp

Tôi đã tìm thấy rất nhiều ví dụ cho các biểu thức nhỏ hoặc sử dụng REPL giống như Mono.Csharp như trình biên dịch thời gian chạy, nhưng tôi không thể tìm thấy ví dụ trong đó "chương trình mini" được thực thi.

Đây là mã đồ chơi của tôi cho đến nay (một hành động MVC). Tham số "mã" được đăng trực tiếp từ vùng văn bản.

[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); 
} 

Bây giờ giả sử mã là một chuỗi như thế này:

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

Làm thế nào để bootstrap này (ví dụ: tạo một đối tượng MyClass và gọi DoSomething vào nó)? Tôi đã thử chỉ cần thêm new MyClass().DoSomething(); vào cuối, nhưng tôi nhận được điều này:

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

Tôi đang thiếu gì?

+1

Bạn có thể đăng toàn bộ tệp có chứa lớp MyClass không? –

+0

Mã MyClass không có trong tệp, nó nằm trong một chuỗi. –

Trả lời

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

Mặc dù câu hỏi này đã được chấp nhận, tôi gặp sự cố tương tự khi tôi chạy qua bài đăng này. Cuối cùng tôi đã tìm ra nó, vì vậy tôi nghĩ tôi sẽ đăng ở đây trong trường hợp người khác gặp rắc rối.

Bạn không thể kết hợp các câu lệnh của using trong cùng một cuộc gọi đến Evaluator. Từ the documentation trên REPO Mono.CSharp:

Tuyên bố sử dụng phải tự xuất hiện và không thể trộn lẫn với câu lệnh thông thường trong một dòng.

Vì điều này là sử dụng các cuộc gọi riêng lẻ đến Evaluator cho mỗi dòng, cùng một hạn chế này áp dụng cho việc gọi số Evaluator từ đơn đăng ký của bạn.

Các vấn đề liên quan