c# – 为递归方法生成IL

c# – 为递归方法生成IL,第1张

概述我尝试使用以下策略为递归方法生成IL, 首先,我使用以下代码片段定义了类型 private void InitializeAssembly(string outputFileName) { AppDomain appDomain = AppDomain.CurrentDomain; AssemblyName assemblyName 我尝试使用以下策略为递归方法生成IL,
首先,我使用以下代码片段定义了类型
private voID InitializeAssembly(string outputfilename)        {            AppDomain appDomain = AppDomain.CurrentDomain;            Assemblyname assemblyname = new Assemblyname(outputfilename);            assemblyBuilder = appDomain.defineDynamicAssembly(assemblyname,AssemblyBuilderAccess.Save);            moduleBuilder = assemblyBuilder.defineDynamicModule(outputfilename,outputfilename + ".exe");            typeBuilder = moduleBuilder.defineType(typename,TypeAttributes.Public);            methodBuilder = typeBuilder.defineMethod("Main",MethodAttributes.Static | MethodAttributes.Public,typeof(voID),System.Type.EmptyTypes);            ilGen = methodBuilder.GetILGenerator();        }

接下来,我开始为递归方法生成IL,如下所示.

MethodBuilder method = typeBuilder.defineMethod(                   “Methodname”,NodeTypetoDotNetType(func.RetType),parameters);                ILGenerator ilOfMethod = method.GetILGenerator();method.defineParameter();

为了在方法体内调用方法本身,我使用了以下构造,

ilOfMethod.Emit(OpCodes.Call,typeBuilder.getmethod("Methodname",new System.Type[] {typeof(arg1),typeof(arg2),etc}));

最后使用以下方法保存生成的组件.

private voID SaveAssembly(string outputfilename)        {            ilGen.Emit(OpCodes.Ret);            typeBuilder.CreateType();            moduleBuilder.CreateGlobalFunctions();            assemblyBuilder.SetEntryPoint(methodBuilder);            assemblyBuilder.Save(outputfilename + ".exe");        }

不幸的是,由于递归方法调用构造,在方法内部返回null,因此无效.这里的问题是在方法内部的递归调用(即ilOfMethod.Emit(OpCodes.Call,typeBuilder.getmethod(“Methodname”,new System.Type [] {typeof(arg1),etc}));
)返回null.因为我们实际上在SaveAssembly()方法中创建了类型,所以这是可以接受的.所以我的问题是:是否有可能使用上述构造为递归方法生成IL?如果不可能,请让我知道用于为递归方法生成IL的替代构造.

解决方法 我还没有测试过,但是如果我没记错的话,你应该能够简单地使用defineMethod的结果来发出Call指令:
MethodBuilder method = typeBuilder.defineMethod("Methodname",...);...ILGenerator ilOfMethod = method.GetILGenerator();...ilOfMethod.Emit(OpCodes.Call,method);
总结

以上是内存溢出为你收集整理的c# – 为递归方法生成IL全部内容,希望文章能够帮你解决c# – 为递归方法生成IL所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1246860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存