2017-02-21 62 views
0

我想使用CodeDomProvider来制作一个C#编译器。 我设法得到错误,但我无法得到输出。CodeDomProvider Console.WriteLine文本

这是我到目前为止有:

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是包含上述

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总是空空的功能的类。 如果我运行这段代码:“Hello World”的

using System; 

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

我能做些什么来显示信息?

回答

0

CompileAssemblyFromSource正如其名称所示,创建一个程序集。要访问编译后的代码,你可以使用the CompilerResults.CompiledAssembly property,然后使用反射来查找和调用Main方法:

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

但如果你设置parameters.GenerateExecutabletrue,可以简化这:

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