作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个“弱事件工厂” - 将任何 Delegate 转换为具有相同签名的新委托(delegate)的代码,但在目标上实现 WeakReference。我正在使用 MSIL 来避免对 Delegate.CreateDelegate 的调用(其性能已被证明很慢)。
只要底层方法(原始委托(delegate)的方法)被声明为公共(public)的,弱引用委托(delegate)就可以完美地工作。一旦使用私有(private)或匿名方法,MSIL 就会在运行时使用 进行轰炸。方法访问异常 .
使用已编译的表达式树,我已经能够调用私有(private)方法,因此必须可以动态发出调用私有(private)方法的 MSIL。 ......那么下面有什么问题?
// var target = this.Target
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Callvirt, targetPropGetter);
il.Emit(OpCodes.Stloc, ilTarget);
// if(target != null)
// {
il.Emit(OpCodes.Ldloc, ilTarget);
il.Emit(OpCodes.Brfalse_S, ilIsNullLabel);
// Method( @target, parm1, parm2 ...);
il.Emit(OpCodes.Ldloc, ilTarget); // this = Target
short argIndex = 1;
foreach (var parm in delgParams) // push all other args
il.Emit(OpCodes.Ldarg, argIndex++);
il.Emit(OpCodes.Callvirt, delegat.Method); // <-- Bombs if method is private
il.Emit(OpCodes.Ret);
// }
il.MarkLabel(ilIsNullLabel);
最佳答案
您是否将您的 IL 插入到 DynamicMethod
或进入动态程序集中的方法?据我了解,无法从动态程序集中跳过可见性检查,但您可以在使用 DynamicMethod
时跳过它们。 (见 here)。
关于.net - MSIL - 如何从 MSIL 调用私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4028264/
我是一名优秀的程序员,十分优秀!