小编Chr*_*ine的帖子

如何保存MethodInfo指针并稍后调用该函数?

C#/ CIL/Reflection.Emit问题:

我正在尝试定义一个具有函数指针的类型,实例化该类型,在另一个类型上创建静态方法(因为我不知道如何使"只是一个函数"),给出一个指向这个静态方法的指针到实例,然后使用该指针调用该函数.

我收效甚微.:-(

这是类型:

Thunk = modb.DefineType("Thunk");

Thunk.DefineField("Env" , Env.AsType(), FieldAttributes.Public);
Thunk.DefineField("Expr", typeof(int), FieldAttributes.Public); // int is the correct type according to http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldftn.aspx

Thunk.CreateType();
Run Code Online (Sandbox Code Playgroud)

到目前为止这么好(我想).然后我创建其中一个人并分配函数指针:

var methodBuilder = MainType.DefineMethod("my_other_little_function", MethodAttributes.Static, typeof(Int64), new[] {Env.AsType()});
{
    var il2 = methodBuilder.GetILGenerator();
    il2.Emit(OpCodes.Ldarg_0);
    il2.Emit(OpCodes.Stloc_0);
    binding.Expr.Compile(il2);
    il2.Emit(OpCodes.Ret);
}
il.Emit(OpCodes.Newobj, ThunkCtor);
il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Stfld, Thunk.GetField("Env"));
il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Ldftn, methodBuilder);
il.Emit(OpCodes.Stfld, Thunk.GetField("Expr"));
Run Code Online (Sandbox Code Playgroud)

据我所知,这部分工作正常.当我尝试调用它时,问题出在其他地方:

var func = il.DeclareLocal(typeof(int));
il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Ldfld, Thunk.GetField("Expr"));
il.Emit(OpCodes.Stloc, func);
il.Emit(OpCodes.Ldfld, Thunk.GetField("Env"));
il.Emit(OpCodes.Ldloc, func);

il.EmitCalli(OpCodes.Calli, CallingConventions.Standard, typeof(Int64), new[] { Env.AsType() }, null);
Run Code Online (Sandbox Code Playgroud)

如果我尝试运行由此创建的程序,我会在执行任何字节码之前得到错误(或者至少它是如何出现的):

Unhandled Exception: …
Run Code Online (Sandbox Code Playgroud)

c# cil reflection.emit methodinfo

5
推荐指数
1
解决办法
1109
查看次数

标签 统计

c# ×1

cil ×1

methodinfo ×1

reflection.emit ×1