这样的事情可能吗?
//
// create a delegate
Action<Type> action = (t) => t.DoSomething;
//
// get the IL generator for a method
ILGenerator il = myMethodBuilder.GetILGenerator();
//
// try and call the delegate
il.EmitCall(OpCodes.Callvirt, action.Method, null);
每当我尝试调用该方法时,我都会收到MethodAccessException。
由于
答案 0 :(得分:3)
每当我尝试调用该方法时,我都会收到MethodAccessException。
这是因为为C#(t) => t.DoSomething
lambda生成的方法是私有的。有可能这个lambda也不会是静态的,这取决于它从外部方法捕获的局部变量。您正在发出callvirt
指令,但您似乎没有提供实例。
您可以通过在Reflector中加载应用程序的代码并查看(t) => t.DoSomething
lambda的实现来验证这一点。
您需要:
public static
方法
Action<Type>
类型参数的方法,生成调用Action<Type>.Invoke
的代码,然后将action
变量传递给生成的方法答案 1 :(得分:0)
看看这是否与提到Here的内容有关。
答案 2 :(得分:0)
如果使用动态方法,则可以在抖动中使用跳过可见性检查。