Как скомпилировать C# код с помощью C# приложения?

Рейтинг: 1Ответов: 0Опубликовано: 20.07.2023

Допустим, есть 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# приложения?

Ответы

Ответов пока нет.