Как скомпилировать C# код с помощью C# приложения?
Допустим, есть C# приложение, и нужно, чтоб это C# приложение скомпилировало из сурс кода другое C# приложение, и при этом программа должна работать без компилятора .net. Возможно ли такое?
Пробовал решить задачу с помощью Microsoft.CodeAnalysis вот таким образом:
using System;
using System.IO;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
namespace HelloWorldBuilder
{
class Program
{
static void Main()
{
string code = @"
using System;
namespace HelloWorld
{
class Program
{
static void Main()
{
Console.WriteLine(""Hello World"");
}
}
}";
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code);
CSharpCompilationOptions compilationOptions = new CSharpCompilationOptions(OutputKind.ConsoleApplication);
string outputAssembly = "main.exe";
var compilation = CSharpCompilation.Create(outputAssembly)
.WithOptions(compilationOptions)
.AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
.AddSyntaxTrees(syntaxTree);
using (var ms = new MemoryStream())
{
EmitResult result = compilation.Emit(ms);
if (result.Success)
{
Console.WriteLine("Программа успешно скомпилирована: " + outputAssembly);
ms.Seek(0, SeekOrigin.Begin);
var assembly = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromStream(ms);
var programType = assembly.GetType("HelloWorld.Program");
var method = programType.GetMethod("Main");
method.Invoke(null, null);
}
else
{
Console.WriteLine("Ошибка при компиляции программы:");
foreach (var diagnostic in result.Diagnostics)
{
Console.WriteLine(diagnostic.GetMessage());
}
}
}
Console.ReadLine();
}
}
}
Однако, в дочернем приложении не получается ничего импортировать, например данный код выдает ошибку: Имя "Console" не существует в текущем контексте.
Как можно исправить этот код или есть, какие либо другие методы компиляции C# приложения из-под C# приложения?
Источник: Stack Overflow на русском