答案:.NET中动态编译C#代码推荐使用Roslyn,通过CSharpSyntaxTree解析源码,CSharpCompilation编译并生成程序集,结合MetadataReference添加引用,Emit输出到内存流,再用Assembly.Load加载并反射执行;旧项目可使用CSharpCodeProvider,但仅限.NET Framework。

在 .NET 中动态编译和执行 C# 代码,可以通过 CSharpCodeProvider 或更现代的 Microsoft.CodeAnalysis.CSharp(Roslyn) 实现。下面介绍两种主流方法,适用于不同 .NET 版本。
使用 Roslyn(推荐方式)
Roslyn 是 .NET 的官方编译器平台,支持运行时编译和执行 C# 代码,适用于 .NET Framework 4.6+ 和 .NET Core/.NET 5+。
1. 安装 NuGet 包:
Microsoft.CodeAnalysis.CSharp
2. 示例代码:编译并执行简单表达式
using Microsoft.CodeAnalysis;using Microsoft.CodeAnalysis.CSharp;using Microsoft.CodeAnalysis.Emit;using System;using System.IO;using System.Reflection;var source = @"using System;public class Script {public static string Run() {return ""Hello from dynamic code!"";}}";
var syntaxTree = CSharpSyntaxTree.ParseText(source);var references = new MetadataReference[]{MetadataReference.CreateFromFile(typeof(object).Assembly.Location),MetadataReference.CreateFromFile(typeof(Console).Assembly.Location)};
var compilation = CSharpCompilation.Create(assemblyName: "DynamicAssembly",syntaxTrees: new[] { syntaxTree },references: references,options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
using var ms = new MemoryStream();EmitResult result = compilation.Emit(ms);
if (!result.Success){foreach (var diag in result.Diagnostics){Console.WriteLine(diag.GetMessage());}}else{ms.Seek(0, SeekOrigin.Begin);Assembly assembly = Assembly.Load(ms.ToArray());Type type = assembly.GetType("Script");object instance = Activator.CreateInstance(type);string output = (string)type.GetMethod("Run").Invoke(instance, null);Console.WriteLine(output); // 输出: Hello from dynamic code!}
使用 CSharpCodeProvider(旧版方法)
适用于 .NET Framework 项目,不推荐用于 .NET Core 及以上版本。
示例代码:
using Microsoft.CSharp;using System.CodeDom.Compiler;using System.Reflection;var provider = new CSharpCodeProvider();var parameters = new CompilerParameters{GenerateInMemory = true,GenerateExecutable = false};
parameters.ReferencedAssemblies.Add("System.dll");
string source = @"using System;public class DynamicClass {public string GetMessage() {return ""Hello from CSharpCodeProvider!"";}}";
CompilerResults results = provider.CompileAssemblyFromSource(parameters, source);
if (results.Errors.HasErrors){foreach (CompilerError error in results.Errors){Console.WriteLine(error.ErrorText);}}else{Assembly assembly = results.CompiledAssembly;object instance = assembly.CreateInstance("DynamicClass");string message = (string)instance.GetType().GetMethod("GetMessage").Invoke(instance, null);Console.WriteLine(message);}
常见使用场景
脚本引擎或插件系统配置化逻辑处理(如规则引擎)在线代码评测或教学工具
注意事项
动态代码存在安全风险,避免执行不可信代码Roslyn 更灵活、性能更好,建议新项目使用注意引用程序集路径,尤其是跨平台时编译错误要仔细检查 Diagnostics 输出
基本上就这些。用 Roslyn 能更好地控制编译过程,也更容易集成到现代 .NET 应用中。
以上就是.NET怎么动态编译和执行C#代码_动态编译执行C#代码方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441298.html
微信扫一扫
支付宝扫一扫