使用“方法”来自 Action的 MethodInfo 属性il.EmitCall 中的委托
这样的事情可能吗?
//
// 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。
谢谢
Is something like this possible?
//
// 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);
Im getting a MethodAccessException whenever I try to invoke the method.
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是因为为 C#
(t) => 生成的方法是t.DoSomething
lambda 是私有的。这个 lambda 也可能不是静态的,具体取决于它从外部方法捕获的局部变量。您正在发出callvirt
指令,但您似乎没有提供实例。您可以通过在 Reflector 中加载应用程序的代码并查看
(t) => 的实现来验证这一点。 t.DoSomething
lambda。您需要执行以下任一操作:
public static
方法Action
类型的参数方法,生成调用Action.Invoke
的代码,然后将action
变量传递到生成的方法中This is because the method generated for the C#
(t) => t.DoSomething
lambda is private. Chances are this lambda won't be static, either, depending on which of the local variables it captures from the outer method. You're issuing acallvirt
instruction but you don't appear to be supplying an instance.You can verify this by loading your application's code in Reflector and looking at the implementation of your
(t) => t.DoSomething
lambda.You need to either:
public static
method in an externally-visible classAction<Type>
in your IL method, generate code that callsAction<Type>.Invoke
, then pass youraction
variable into the generated method看看这是否与提到的内容有关 这里。
See if this is related to what is mention Here.
如果您使用动态方法,则可以在抖动中使用跳过可见性检查。
If you use a dynamic method you can use the skip visibility checks in the jitter.