我只是好奇我将如何使用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"));
任何想法,我做错了什么?
BTW,我得到的错误是 Common Language Runtime detected an invalid program.
和JIT Compiler encountered an internal limitation.
什么是所有注释掉的代码?也似乎是很多不相关的代码。 – leppie 2013-02-16 07:30:05
为什么不直接在发布模式下编译C#代码段,并查看IL生成的内容。这应该是微不足道的。 – leppie 2013-02-16 07:31:47
'(注释掉的东西是我一直在打开和关闭的东西,试图使其工作)' – 2013-02-16 07:32:00