2017-02-21 3 views
0

Ich versuche CodeDomProvider verwenden, um einen C# -Compiler zu machen. Ich habe es geschafft, die Fehler zu bekommen, aber ich kann die Ausgabe nicht bekommen.Console.WriteLine Text von CodeDomProvider

Dies ist, was ich bisher:

public List<string> Errors(CompilerResults compilerResults) 
    { 
     List<string> messages = new List<string>(); 

     foreach (CompilerError error in compilerResults.Errors) 
     { 
      messages.Add(String.Format("Line {0} Error No:{1} - {2}", error.Line, error.ErrorNumber, error.ErrorText)); 
     } 

     return messages; 
    } 

    public CompilerResults ProcessCompilation(string programText) 
    { 
     CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp"); 
     CompilerParameters parameters = new CompilerParameters(); 
     parameters.GenerateExecutable = false; 
     StringCollection assemblies = new StringCollection(); 
     return codeDomProvider.CompileAssemblyFromSource(parameters, programText); 
    } 

CSharpCompiler ist die Klasse, die die Funktionen von oben

public JsonResult Compiler(string code) 
    { 
     CSharpCompiler compiler = new CSharpCompiler(); 
     CompilerResults compilerResults = compiler.ProcessCompilation(code); 

     Debug.WriteLine("OUTPUT----------------------------------------------"); 
     foreach (var o in compilerResults.Output) 
     { 
      Debug.WriteLine(o); 
     } 

     List<string> compilerErrors = compiler.Errors(compilerResults); 

     if (compilerErrors.Count != 0) 
      return Json(new { success = false, errors = compilerErrors}); 

     return Json(true); 
    } 

compilerResults.Output ist immer leer enthält. Wenn ich laufe dieses Stück Code: „Hallo Welt!“

using System; 

public class HelloWorld 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Hello world!"); 
    } 
} 

Was kann ich tun, um die Nachricht anzuzeigen?

Antwort

0

CompileAssemblyFromSource erstellt, wie der Name schon sagt, eine Baugruppe. Um Zugriff auf den kompilierten Code zu erhalten, können Sie the CompilerResults.CompiledAssembly property verwenden und dann mithilfe von Reflektion finden und rufen Sie das Main Methode:

compilerResults.CompiledAssembly.GetType("HelloWorld").GetMethod("Main").Invoke(null, null); 

Obwohl, wenn Sie setzen parameters.GenerateExecutable zu true, können Sie vereinfachen dies:

compilerResults.CompiledAssembly.EntryPoint.Invoke(null, null); 
Verwandte Themen