我试图写我自己的玩具我的玩具语言 - > MSIL编译器,以更好地了解如何编译工作。 我得到了解析和词法的工作,我已经建立了表达式树,并使用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定义类级别的方法。
你说,你已经有词法和语法分析器。 这意味着你能够建立AST。 所以,步行穿过解析表达式,放出你的IL。
即使你生成(由编译)代码,就无法用它做什么有用的,因为生成的代码依赖于基础设施。 例如,如果你需要编译倒闭,那么你应该创建类或其他商店FO词法变量等(如非词法控制转移需要以使用.NET异常)