.net - 将 .NET 表达式树链接到新程序集

标签 .net expression-trees cil reflection.emit

我正在尝试编写自己的玩具 My Toy Language -> MSIL 编译器,以便更好地了解编译器的工作原理。我得到了解析和词法分析工作,我已经构建了表达式树并使用 System.Linq.Expressions 表达式树 API,我有一个工作解释器。现在我想发出一些真正的 MSIL 程序集。

问题是,我不知道如何实际构建这些程序集。 MethodBuilder类只接受原始 MSIL 方法体,因此我必须获取表达式树的原始 MSIL。调用Expression.Compile()返回一个工作委托(delegate),但我无法获得其基础 MSIL。调用MethodInfo.GetMethodBody()抛出一个 InvalidOperationException 因为它没有在那个特定的子类中实现。

如何将该委托(delegate)链接到新程序集?

最佳答案

刚找到。 LambdaExpression 的 DLR 版本公开了一个 CompileToMethod 方法,该方法正是我需要的。

lambdaExpression.CompileToMethod(myMethodBuilder);

关于.net - 将 .NET 表达式树链接到新程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1618682/

相关文章:

c# - XNA,更流畅的跳跃动画

c# - 给 CIL 写评论

c# - 检查构造函数是否调用另一个构造函数

c# - 为什么编译器添加了一个不需要的局部变量

c# - WPF 动态 DataGrid 绑定(bind)值从集合中的嵌套对象到自定义 DataGridCell 模板

.net - 如何将 TransactionScope 与 MySql 和 Entity Framework 一起使用? (获取多个同时连接...当前不支持错误)

c# - 搜索 24 小时内发生的 X 次事件

c# - 如何在通用扩展方法中使用字符串列名称在 IQueryable 上应用 OrderBy?

c# - 为什么编译器不对静态表达式树使用相同的对象引用?

entity-framework-4.1 - Entity Framework 4.1和NHibernate的抓取策略封装