2017-02-21 33 views
0

Я пытаюсь использовать CodeDomProvider для создания компилятора C#. Мне удалось получить ошибки, но я не могу получить результат.Console.WriteLine текст от CodeDomProvider

Это то, что я до сих пор:

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.GetType("HelloWorld").GetMethod("Main").Invoke(null, null); 

Хотя, если вы установите parameters.GenerateExecutable в true, вы можете упростить это:

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

 Смежные вопросы

  • Нет связанных вопросов^_^