2012-09-28 40 views
6

Kullanıcının kod örneklerini deneyebileceği/değiştirebileceği ve neler olduğunu görebileceği etkileşimli bir C# öğretme uygulaması yazmaya çalışıyorum (jsfiddle gibi).Mono.Csharp'da bir mini program çalıştırılıyor

Mono.Csharp'ın çalışma zamanı derleyicisi olarak küçük ifadeler veya REPL benzeri kullanımlar için birçok örnek buldum, ancak bir "mini program" ın yürütüldüğü bir örnek bulamıyorum.

Buraya kadar benim oyuncak kodum (MVC eylemi). "Kod" parametresi doğrudan bir textarea'dan gönderilir. Bunun (yani bir MyClass nesnesini başlatmalı ve üzerinde DoSomething diyoruz) bootstrap nasıl

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

:

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

Şimdi kod böyle bir dize olduğunu varsayalım? Sadece sonuna new MyClass().DoSomething(); ekleme denedim ama bu alın:

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

ben eksik? bu soru zaten kabul edilmiş olmasına rağmen ben bu yazı karşılaştım zaman

+1

MyClass sınıfını içeren tüm dosyayı gönderir misiniz? –

+0

MyClass kodu bir dosyada değil, bir dizede. –

cevap

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

, ben benzer bir sorun yaşıyordu. Sonunda anladım, başka birinin başımı belaya sokması için buraya yollayacağımı düşündüm.

using 'un ve diğer deyimlerin aynı çağrıda Evaluator ile karıştırılamıyor. Mono.CSharp Çoğaltma üzerinde the documentation Gönderen:

kullanarak bildirimleri kendi başlarına almalıdır ve tek bir satırda düzenli ifadelerle arada kullanılamaz. Bu her hat için Evaluator bireysel çağrıları kullanan olduğundan

, bu aynı kısıtlama uygulamanızdan Evaluator çağırma için de geçerlidir.

İlgili konular