Console.WriteLine текст из CodeDomProvider
Я пытаюсь использовать CodeDomProvider для создания компилятора C#. Мне удалось получить ошибки, но я не могу получить вывод.
Это то, что я имею до сих пор:
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!");
}
}
Что я могу сделать, чтобы отобразить сообщение "Hello world!"?
1 ответ
CompileAssemblyFromSource
создает, как следует из названия, сборку. Чтобы получить доступ к скомпилированному коду, вы можете использовать CompilerResults.CompiledAssembly
свойство, а затем использовать отражение, чтобы найти и вызвать Main
метод:
compilerResults.CompiledAssembly.GetType("HelloWorld").GetMethod("Main").Invoke(null, null);
Хотя, если вы установите parameters.GenerateExecutable
в true
Вы можете упростить это до:
compilerResults.CompiledAssembly.EntryPoint.Invoke(null, null);