2012-09-28 46 views
6

में एक मिनी-प्रोग्राम चलाना मैं एक इंटरैक्टिव सी # शिक्षण ऐप लिखने की कोशिश कर रहा हूं, जहां उपयोगकर्ता कोड उदाहरणों का प्रयोग/परिवर्तन कर सकता है और देख सकता है कि क्या होता है (थोड़े की तरह jsfiddle)।Mono.Csharp

मुझे छोटे अभिव्यक्तियों या आरईपीएल जैसे रनोटाइम कंपाइलर के रूप में Mono.Csharp के उपयोग के लिए बहुत सारे उदाहरण मिल गए हैं, लेकिन मुझे ऐसा कोई उदाहरण नहीं मिल रहा है जहां "मिनी प्रोग्राम" निष्पादित किया गया हो।

यहां मेरा खिलौना कोड अब तक है (एक एमवीसी कार्रवाई)। "कोड" पैरामीटर सीधे टेक्स्टरेरा से पोस्ट किया जाता है।

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

मैं कैसे bootstrap कि यह (अर्थात् एक 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' 

मैं क्या याद आ रही है?

+1

क्या आप पूरी फ़ाइल पोस्ट कर सकते हैं जिसमें MyClass क्लास है? –

+0

MyClass कोड फ़ाइल में नहीं है, यह एक स्ट्रिंग में है। –

उत्तर

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

हालांकि इस सवाल पहले से ही स्वीकार किया गया है, मैं एक ऐसी ही समस्या आ रहा था जब मैं इस पोस्ट भर में भाग गया। आखिरकार मैंने इसे समझ लिया, इसलिए मैंने सोचा कि अगर कोई और परेशानी में पड़ता है तो मैं यहां पोस्ट करूंगा।

आप using और Evaluator पर उसी कॉल में अन्य कथन मिश्रण नहीं कर सकते हैं। Mono.CSharp आरईपीएल पर the documentation से:

घोषणाओं का उपयोग कर अपने दम पर प्रदर्शित होना चाहिए और एक पंक्ति में नियमित रूप से बयान के साथ नहीं मिलाया जा सकता।

चूंकि यह प्रत्येक पंक्ति के लिए Evaluator लिए अलग-अलग कॉल का उपयोग है, यह वही प्रतिबंध आपके आवेदन से Evaluator लागू करने के लिए लागू होता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^