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

问题是,我无法弄清楚如何实际构建这些程序集。 MethodBuilder 类仅接受原始MSIL方法体,所以我必须获得表达式树的原始MSIL。调用 Expression.Compile()会返回一个工作代表,但我不是能够获得其基础MSIL。调用 MethodInfo.GetMethodBody()会引发InvalidOperationException因为它没有在那个特定的子类中实现。

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

有帮助吗?

解决方案

刚刚找到它。 LambdaExpression的DLR版本公开了一个CompileToMethod方法,它完全符合我的需要。

lambdaExpression.CompileToMethod(myMethodBuilder);

其他提示

为了发出原始IL,您需要定义自己的AST。你需要获得AssemblyBuilder然后使用ModuleBuilder,然后你可以定义模块级方法或者获得新的TypeBuilder,现在使用MethodBuilder来定义类级方法。

你说你已经有了lexer和解析器了。这意味着你可以构建AST。所以只需遍历解析后的表达式并发出你的IL。

即使您生成(通过编译)代码,您也无法对其执行有用的操作,因为生成的代码依赖于基础结构。例如,如果你需要编译闭包,那么你应该创建类或其他存储的词法变量等等(比如非词法控件传输需要在.net中使用异常)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top