0

を使用してフィールドのメソッドを呼び出す方法に興味がありますEmit

このクラスを生成しました

public class AClass : IDynamicProxyTestInterface
{
    private DynamicProxy<IDynamicProxyTestInterface> proxy;
    public AClass(DynamicProxy<IDynamicProxyTestInterface> p)
    {
        proxy = p;
    }

    public void Hello()
    {
        // Here I want to do the following
        Int32 code = 123456;
        proxy.HandleCall(code);
    }
}

コメントされた部分は、私が理解するのに苦労してきたものです。

私はこのコードを持っています(コメントアウトされたものは、それを機能させるためにオンとオフを切り替えてきたものです)

var methodBuilder = typeBuilder.DefineMethod(
    methodInfo.Name,
    MethodAttributes.Public | MethodAttributes.Virtual,
    methodInfo.ReturnType, 
    methodInfo.GetParameters().Select(p => p.GetType()).ToArray()
    );
var methodIlGen = methodBuilder.GetILGenerator();

// Add proxy call to method
var emptyAction = new DynamicProxyOnBuilder();
ProxyCalls.Add(methodInfo.GetHashCode(), emptyAction);

// Drop method info hash into local variable 0
//var hash = methodInfo.GetHashCode();
//methodIlGen.Emit(OpCodes.Ldc_I4, hash);
//methodIlGen.DeclareLocal(typeof(Int32), false);
//methodIlGen.Emit(OpCodes.Stloc_0);

// Create local variable for instance of this DynamicProxy
methodIlGen.Emit(OpCodes.Ldarg_0);
methodIlGen.Emit(OpCodes.Ldflda, proxyField);
var var2 = methodIlGen.DeclareLocal(this.GetType());
methodIlGen.Emit(OpCodes.Stloc,var2);
////methodIlGen.EmitWriteLine(proxyField);
////methodIlGen.Emit(OpCodes.St);
//methodIlGen.Emit(OpCodes.Ldloc,var2);
methodIlGen.Emit(OpCodes.Call, this.GetType().GetMethods().First(x => x.Name == "HandleCall"));

私がここで間違っていることについて何か考えはありますか?

ところで、私が得るエラー Common Language Runtime detected an invalid program.JIT Compiler encountered an internal limitation.

4

1 に答える 1

3

通常、このような状況で行う最善の方法は、コードをc#で記述し、コンパイルしてから、コンパイルされたILを調べることです。

あなたの場合、あなたが見逃している主なことは、メソッドが「ret」命令で終了する必要があり、HandleCallが仮想である必要があるということです。したがって、必要なのは(HandleCallのリターンタイプが無効であると想定)

Ldflda [proxyField]   // push the this pointer
Ldc_I4 123            // push the argument
Callvirt [HandleCode] // call the method
Ret                   // return
于 2013-02-16T10:51:40.920 に答える