2017-02-21 3 views
0

CodeDomProvider를 사용하여 C# 컴파일러를 만들려고합니다. 오류를 얻을 수 있었지만 출력을 얻을 수 없습니다.Code.DomProvider의 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

이상에서 함수가 포함 된 클래스입니다. 나는이 코드 조각을 실행하면 : "안녕하세요 세상을"

using System; 

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

내가 메시지를 표시하기 위해 무엇을 할 수 있습니까?

답변

0

CompileAssemblyFromSource은 이름에서 알 수 있듯이 어셈블리를 만듭니다. 컴파일 된 코드에 대한 액세스를 얻으려면, 당신은 the CompilerResults.CompiledAssembly property 사용하고 찾을 수 반사를 사용하고 Main 방법을 호출 할 수 있습니다

compilerResults.CompiledAssembly.EntryPoint.Invoke(null, null); 
: 당신이 parameters.GenerateExecutable true에 설정하면

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

비록을, 당신은이를 단순화 할 수 있습니다

관련 문제