新闻中心

.NET怎么动态编译和执行C#代码

2025-11-19
浏览次数:
返回列表
答案:在 .NET 中动态编译和执行 C# 代码推荐使用 Roslyn API,通过 Microsoft.CodeAnalysis.CSharp 命名空间提供的语法树、编译选项和发射功能实现;首先解析代码为 SyntaxTree,添加必要程序集引用,创建 CSharpCompilation 对象并调用 Emit 生成程序集,成功后加载到内存并通过反射实例化类并调用方法;相比已弃用的 CSharpCodeProvider,Roslyn 更强大灵活,适用于脚本引擎、插件系统等场景,需注意安全性和性能优化,如缓存编译结果。

.net怎么动态编译和执行c#代码

在 .NET 中动态编译和执行 C# 代码,主要通过 Microsoft.CSharpSystem.CodeDom.Compiler 命名空间中的类来实现,尤其是使用 CSharpCodeProvider 或更新的 Microsoft.CodeAnalysis.CSharp(即 Roslyn 编译器 API)。

使用 Roslyn 动态编译和执行代码(推荐方式)

Roslyn 是 .NET 的开源编译器平台,支持在运行时编译和执行 C# 代码。相比旧的 CodeDom 方法,它更强大、灵活且性能更好。

安装 NuGet 包:
  • Microsoft.CodeAnalysis.CSharp

示例:动态编译并执行一个简单的函数

代码示例:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
using System;
using System.IO;
using System.Reflection;
<p>string code = @"
using System;
public class Script {
public string Run() {
return ""Hello from dynamic code!"";
}
}";</p><p>// 构建语法树
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code);</p><p>// 设置引用程序集
MetadataReference[] references = new MetadataReference[]
{
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
MetadataReference.CreateFromFile(typeof(Console).Assembly.Location)
};</p><p>// 创建编译选项
CSharpCompilation compilation = CSharpCompilation.Create(
assemblyName: "DynamicAssembly",
syntaxTrees: new[] { syntaxTree },
references: references,
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
);</p><p>// 执行编译
EmitResult result = compilation.Emit();
if (!result.Success)
{
foreach (Diagnostic diagnostic in result.Diagnostics)
{
Console.WriteLine(diagnostic.ToString());
}
}
else
{
// 加载编译后的程序集
using (var ms = new MemoryStream())
{
result.AssemblyImage.WriteTo(ms);
Assembly assembly = Assembly.Load(ms.ToArray());</p><pre class="brush:php;toolbar:false;">    // 创建实例并调用方法
    Type scriptType = assembly.GetType("Script");
    object instance = Activator.CreateInstance(scriptType);
    string output = (string)scriptType.GetMethod("Run").Invoke(instance, null);
    Console.WriteLine(output); // 输出: Hello from dynamic code!
}

}

Whimsical Whimsical

Whimsical推出的AI思维导图工具

Whimsical 182 查看详情 Whimsical

使用 CSharpCodeProvider(.NET Framework 兼容方式)

适用于传统 .NET Framework 项目,但在 .NET Core/.NET 5+ 中已被弃用。

示例代码:
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
<p>string code = @"
using System;
public class DynamicClass {
public string GetMessage() {
return &quot;"Hello from CSharpCodeProvider!"";
}
}";</p><p>CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters
{
GenerateInMemory = true,
GenerateExecutable = false
};
parameters.ReferencedAssemblies.Add("System.dll");</p><p>CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);</p><p>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 支持语法分析、语义分析等高级功能,适合构建工具

基本上就这些。使用 Roslyn 是现代 .NET 推荐的做法,功能强且维护性好。

以上就是.NET怎么动态编译和执行C#代码的详细内容,更多请关注其它相关文章!


# microsoft  # 工具  # 阳江网站公司推广建设  # 福建网站推广流程  # 百度网站推广工作  # 瑞安高端网站建设  # 猫先森网络SEO资讯  # 建材seo排名优化引流  # 长春seo网  # 宝应建设网站  # 新抚区关键词seo排名优化  # 慈溪seo网络优化托管  # 推荐使用  # 但在  # 已被  # 尤其是  # 扁平化  # 加载  # 更强大  # 如何实现  # 什么用  # 适用于  # .net  # c#  # stream 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  React Router 嵌套组件中 URL 重定向问题的解决方案  快速CSGO开箱网站指南 CSGO开箱平台推荐  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  必由学官网首页入口 必由学教师网页版登录指南  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  Composer如何在生产环境安全地执行composer update  外媒分析《GTA6》定价:卖100美元可以但真没必要!  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  CSS子选择器:如何区分并样式化嵌套列表的子层级  J*aScript中针对特定容器内图片动画的实现教程  AO3最新入口2025公告_AO3中文官网合集  电脑IP地址怎么查 查看本机IP地址的几种方法  cad如何更改注释性对象的比例_cad注释性比例调整方法  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  c++ 命名空间怎么用 c++ namespace使用指南  c++ dfs和bfs代码 c++深度广度优先搜索算法  《GTA6》开发画面疑似泄露!这次可不是AI了  mc.js官网登录入口 mc.js官方登录入口最新版  新三国志曹操传110级星符试炼夏侯渊极难攻略  zookeeper 都有哪些功能?  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  实现分段式页面滚动导航:CSS与J*aScript教程  QQ官网正版登录链接 QQ在线登录入口最新  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  CSS图片焦点样式实现教程:理解与应用tabindex属性  2025-2030年全球乘用车销量预测:新能源成增长主力  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  PHP中高效并行检查多链接状态的教程  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  大象笔记网页版入口 印象笔记网页版登录入口  c++20的std::jthread是什么_c++可中断线程与RAII式管理  Win11怎么开启省电模式_Win11电池节电模式自动开启  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  Lar*el Excel导入时生成自定义递增ID的策略与实践  抖音从哪里进入网页版_抖音官方入口链接  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  Lar*el DB::listen 事件中的查询执行时间单位解析  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  小米14应用无法联网原因分析_小米14网络权限修复 

搜索