gpt4 book ai didi

c# - 为递归方法生成 IL

转载 作者:太空狗 更新时间:2023-10-29 20:21:54 25 4
gpt4 key购买 nike

我尝试使用以下策略为递归方法生成 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”,
MethodAttributes.Static | MethodAttributes.Public,
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),typeof(arg2),etc}) );) 返回空值。因为我们实际上是在 SaveAssembly() 方法中创建类型,所以这是可以接受的。所以我的问题是:是否可以使用上述构造为递归方法生成 IL?如果不可能,请让我知道为递归方法生成 IL 的替代结构。

最佳答案

我还没有测试过,但如果我没记错的话,你应该能够简单地使用 DefineMethod 的结果来发出 Call 指令:

MethodBuilder method = typeBuilder.DefineMethod("MethodName", ...);
...

ILGenerator ilOfMethod = method.GetILGenerator();

...
ilOfMethod.Emit(OpCodes.Call, method);

关于c# - 为递归方法生成 IL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6489819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com