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


答案:在 .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!
}

}

Primeshot Primeshot

专业级AI人像摄影工作室

Primeshot 36 查看详情 Primeshot

使用 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 ""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#代码的详细内容,更多请关注其它相关文章!


# 已被  # seo 竞价引流  # 本地推广营销用户体验怎么写  # 长沙全网营销推广  # 利于seo商城源码  # 做seo优化的  # 百事营销推广怎么样做的  # 为美食app做营销推广的好处  # 香港营销推广多少钱一个月  # 梧州创新seo方法  # 炎陵黄桃营销推广  # 推荐使用  # 但在  # 工具  # 尤其是  # 加载  # 更胜  # 更强大  # 对决  # 更有  # 适用于  # .net  # c#  # stream  # microsoft 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  windows10怎么关闭自动安装应用_windows10禁止推广应用下载  《360浏览器》自动保存账号密码设置方法  diskgenius分区工具如何设置Bios启动项  嘴唇干裂起皮怎么办 唇部护理与预防干裂的方法【详解】  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  背部总是隐隐作痛怎么回事 背痛如何改善  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  《植物大战僵尸3》火龙草作用介绍  J*a中导出MySQL表为SQL脚本的两种方法  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  J*aScript模块加载器_RequireJS原理分析  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解  Retrofit根路径POST请求:@POST("/") 的应用与解析  抖音视频如何添加标题?添加标题有哪些好处?  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  PHP中获取HTTP响应状态消息:方法与限制  HTML中多图片上传与预览:解决ID冲突的专业指南  《七读免费小说》开通会员方法  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  OPPO A3 WiFi频繁断开怎么办 OPPO A3网络优化技巧  如何使用 composer 和 aop-php 实现 AOP 编程?  电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】  《洛克王国:世界》国家队搭配攻略  XPath动态元素定位:如何精准选择文本内容变化的元素  windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  以下哪一个是适应长期护理制度发展而设立的新职业  J*aScript与HTML元素交互:图片点击事件与链接处理教程  Vue 3中独立响应式实例的创建与应用  店铺如何做视频号推广?做视频号推广有用吗?  抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法  mysql如何限制远程访问_mysql远程访问限制方法  英国搜索:多数英国人认为语言搜索是未来搜索  4399小游戏下装链接 4399小游戏下载链接入口  厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项  可米酷漫画在线阅读入口_ 可米酷漫画官网直达链接  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  解决Flex容器横向滚动内容截断与偏移问题  LocoySpider如何批量采集电商商品_LocoySpider电商采集的模板应用  C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析  小米civi如何设置锁屏时间  之了课堂app做题入口  《搜书吧》阅读书籍方法  解决Go encoding/json 将JSON大数字解析为浮点数的问题  铁路12306官网登录入口 铁路12306在线购票官方平台  优化 React onClick 事件处理:函数引用与箭头函数的对比 

 2025-11-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.