如何在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
相关产品推荐
相关产品推荐

