You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#程序运行时编译C#代码为EXE?求CSharpCodeProvider替代方案

替代过时CSharpCodeProvider的C#代码编译方案

核心替代方案:使用Roslyn编译器(Microsoft.CodeAnalysis.CSharp)

CSharpCodeProvider属于旧.NET Framework编译API,在.NET Core/.NET 5+中已过时且不支持跨平台。目前推荐用**Roslyn(.NET Compiler Platform)**的Microsoft.CodeAnalysis.CSharp包实现代码编译,它支持跨平台且功能更完善。

步骤1:安装依赖包

通过NuGet安装以下包:

dotnet add package Microsoft.CodeAnalysis.CSharp
dotnet add package Microsoft.CodeAnalysis.Common

步骤2:示例代码实现

以下代码实现读取指定C#文件并编译为EXE,包含错误处理逻辑:

using System;
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

class CodeCompiler
{
    static void Main(string[] args)
    {
        // 待编译的C#文件路径
        string sourceFilePath = @"C:\YourCode\Sample.cs";
        // 输出EXE路径
        string outputExePath = @"C:\YourOutput\Sample.exe";

        // 读取源代码
        string sourceCode = File.ReadAllText(sourceFilePath);

        // 设置编译选项:指定输出为控制台应用(可改为WindowsApplication生成窗体程序)
        var compilationOptions = new CSharpCompilationOptions(OutputKind.ConsoleApplication)
            .WithOptimizationLevel(OptimizationLevel.Release)
            .WithPlatform(Platform.AnyCpu);

        // 添加必要的程序集引用(以.NET 6为例,可根据代码依赖调整)
        var references = new[]
        {
            MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
            MetadataReference.CreateFromFile(typeof(Console).Assembly.Location)
        };

        // 创建编译对象
        var compilation = CSharpCompilation.Create(
            Path.GetFileNameWithoutExtension(outputExePath),
            syntaxTrees: new[] { CSharpSyntaxTree.ParseText(sourceCode) },
            references: references,
            options: compilationOptions);

        // 执行编译并生成EXE
        var emitResult = compilation.Emit(outputExePath);

        // 处理编译结果
        if (emitResult.Success)
        {
            Console.WriteLine($"EXE已生成:{outputExePath}");
        }
        else
        {
            Console.WriteLine("编译失败,错误信息:");
            foreach (var diagnostic in emitResult.Diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Error))
            {
                Console.WriteLine($"[{diagnostic.Id}] {diagnostic.GetMessage()} 行{diagnostic.Location.GetLineSpan().StartLinePosition.Line + 1}");
            }
        }
    }
}

关键说明

  • 若需编译Windows窗体程序,将OutputKind改为OutputKind.WindowsApplication。
  • 根据代码依赖添加对应程序集引用(如使用ASP.NET Core需补充相关框架引用)。
  • 该方案支持Windows、Linux、macOS跨平台运行,不会触发PlatformNotSupportedException。

内容的提问来源于stack exchange,提问作者edy131109

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:47:26