Roslyn:如何获得.NET6.0 代码编译成一个 exe

Roslyn: How to get .NET6.0 code compiled into one exe

提问人:szajch 提问时间:11/12/2023 更新时间:11/16/2023 访问量:41

问:

我正在尝试编译此 C# 代码:

    using System;
    
    namespace test
    {
        internal static class Program
        {
            static void Main()
            {
                Console.WriteLine("Test");
                Console.ReadKey(true);
            }
        }
    }

复制到单个 .exe 文件中,通过使用 Roslyn:

                var syntaxTree = CSharpSyntaxTree.ParseText(source);

                var compilation = CSharpCompilation.Create("program.exe")
                    .WithOptions(new CSharpCompilationOptions(OutputKind.ConsoleApplication))
                    .AddReferences(Net60.References.All)
                    .AddSyntaxTrees(syntaxTree);

                EmitResult emitResult = compilation.Emit(Path.Combine(path, "program.exe"));

                if (emitResult.Success)
                {
                    MessageBox.Show("Compiled.");
                }
                else
                {
                    MessageBox.Show($"The compiler has encountered {emitResult.Diagnostics.Length} errors", "Errors while compiling");
                    foreach (var diagnostic in emitResult.Diagnostics)
                    {
                        MessageBox.Show($"{diagnostic.GetMessage()}\nLine: {diagnostic.Location.GetLineSpan().StartLinePosition.Line} - Column: {diagnostic.Location.GetLineSpan().StartLinePosition.Character}", "Error");
                    }
                }

编译时没有单一错误。它“正确”编译,但是当我在控制台中启动它时,会出现此错误弹出窗口:Unhandled exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The specified file could not be found.

在通过 Visual Studio 编译(编译到.exe和.dll)时,它可以工作。

我怎样才能让它工作?我只需要它编译成一个单.exe文件。这甚至可能吗?

. NET-6.0 罗斯林

评论


答:

1赞 Jason Malinowski 11/16/2023 #1

罗斯林则不然;.NET SDK 支持将内容合并到单个可执行文件中,但这是作为发布的一部分完成的,而不是 Roslyn 直接执行的。要记住的一件事是,Roslyn 只是这里更大的工具链的一部分。