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

在 .NET 中动态编译和执行 C# 代码,主要通过 Microsoft.CSharp 和 System.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推出的AI思维导图工具
182
查看详情
使用 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 &q
uot;"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网络权限修复


2025-11-19
浏览次数:次
返回列表
uot;"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);
}