首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reflection.Emit中的函数调用

Reflection.Emit中的函数调用
EN

Stack Overflow用户
提问于 2016-01-14 01:29:16
回答 1查看 504关注 0票数 1

我目前正在用C#编写一种编程语言。我很难理解如何动态地执行函数调用。现在我确定了如何调用用户定义的函数。我明白,要输出“你好世界”,就需要这样的东西:

代码语言:javascript
复制
ilg.Emit(OpCodes.Ldstr, "Hello, World!");
ilg.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
            new Type[] {typeof(string)} ));

但是如果有一个用户定义的函数,我该怎么办呢?

做这件事最好的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-14 03:01:09

您可以传递一个MethodBuilder作为发射的参数,因为MethodBuilder是从MethodInfo继承的,因此它将在调用时调用正确的方法。使用您的玩具程序def hello(string msg) { print(msg); } hello("Hello!");,这里展示了如何为这个程序发出代码:

代码语言:javascript
复制
ILGenerator ilg;
var asmName = new AssemblyName("DynamicAssembly");
var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndCollect);
var modBuilder = asmBuilder.DefineDynamicModule("DynamicAssembly");
var type = modBuilder.DefineType("<>CompilerFunctionClass", TypeAttributes.Class | TypeAttributes.Public);
type.DefineDefaultConstructor(MethodAttributes.Public);
var helloBuilder = type.DefineMethod("hello", MethodAttributes.Family | MethodAttributes.Static, typeof(void), new[] { typeof(string) });

// emitting code for hello later
var mainBuilder = type.DefineMethod("Main", MethodAttributes.Public);
ilg = mainBuilder.GetILGenerator();
ilg.Emit(OpCodes.Ldstr, "Hello, World!");
ilg.Emit(OpCodes.Call, helloBuilder);
ilg.Emit(OpCodes.Ret);

// Here we emit the code for hello.
ilg = helloBuilder.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
            new Type[] { typeof(string) }));
ilg.Emit(OpCodes.Ret);

// just to show it works.
var t = type.CreateType();
dynamic d = Activator.CreateInstance(t);
d.Main(); // prints Hello, World!

您的编译器可能会首先发现所有顶级函数名,然后为它们定义方法,然后它可以为每个方法生成代码。

请注意,对于玩具示例和学习项目,Reflection.Emit是很好的,但是它的功能还不足以完成成熟编译器所需要的工作。请参见注释埃里克·利珀特在这里。他建议使用通用编译器基础设施构建一个编译器。我没用过,所以我不能说。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34780193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档