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

Tam*_*ege 5 .net cil reflection.emit expression-trees

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

问题是,我无法弄清楚如何实际构建这些程序集.该MethodBuilder类只接受原MSIL方法体,所以我必须让我的表达式树的原始MSIL.调用Expression.Compile()会返回一个工作委托但我无法获取其底层MSIL.调用MethodInfo.GetMethodBody()会抛出InvalidOperationException,因为它没有在该特定子类中实现.

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

Tam*_*ege 4

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

lambdaExpression.CompileToMethod(myMethodBuilder);
Run Code Online (Sandbox Code Playgroud)