加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为递归方法生成IL

发布时间:2020-12-15 08:08:02 所属栏目:百科 来源:网络整理
导读:我尝试使用以下策略为递归方法生成IL, 首先,我使用以下代码片段定义了类型 private void InitializeAssembly(string outputFileName) { AppDomain appDomain = AppDomain.CurrentDomain; AssemblyName assemblyName = new AssemblyName(outputFileName); ass
我尝试使用以下策略为递归方法生成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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读