我正在尝试编写自己的玩具 My Toy Language -> MSIL 编译器,以便更好地了解编译器的工作原理。我的解析和词法分析工作正常,我已经构建了表达式树并使用 System.Linq.Expressions 表达式树 API,我有一个工作解释器。现在我想发出一些真正的 MSIL 程序集。
问题是,我不知道如何实际构建这些程序集。这方法构建器 http://msdn.microsoft.com/en-us/library/system.reflection.emit.methodbuilder.aspx类仅接受原始 MSIL 方法体,因此我必须获取表达式树的原始 MSIL。呼唤表达式.Compile() http://msdn.microsoft.com/en-us/library/bb345362.aspx返回一个工作委托,但我无法获取其底层 MSIL。呼唤MethodInfo.GetMethodBody() http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx抛出 InvalidOperationException,因为它未在该特定子类中实现。
如何将该代表链接到新程序集中?
刚刚找到了。 LambdaExpression 的 DLR 版本公开了一个 CompileToMethod 方法,该方法正是我所需要的。
lambdaExpression.CompileToMethod(myMethodBuilder);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)