繁体   English   中英

Mac OS X / Mono下的ldfld问题,可能是Mono错误

[英]Ldfld problems under Mac OS X / Mono, probably Mono bug

我正在使用第3方库JInt(JavaScript中断程序),该库工作正常,直到切换到Mac OS X,此后,我继续获取ArgumentNullExceptions,经过一番调查,我发现JInt使用动态代码生成来制作某种Js-Clr桥。 最后,此方法具有以下说明:

code.Emit(OpCodes.Ldnull);
FieldInfo fieldInfo = typeof(JsUndefined).GetField("Instance");
code.Emit(OpCodes.Ldfld, fieldInfo);

这是这些行的执行方式( 此处为完整屏幕截图)

在此处输入图片说明

可以清楚地看到fieldInfo参数不为null,尽管在执行这些行时,请注意LDFLD没有参数! 此处为完整屏幕截图):

在此处输入图片说明

我当前要执行的语句是Ldnull,我在Ldfld上执行了“ Step In”(在Ldnull上),BANG异常发生了( 此处为全尺寸屏幕截图):

在此处输入图片说明

有什么建议么?

您描述的问题是不同问题的组合:

  • IL反汇编不显示字段操作数。 它不仅适合您的领域,而且您可以在ldsfld的反汇编中看到它。 我不必担心,我鼓励您报告它存在一个MonoDevelop错误。

  • JInt使用奇怪的模式在堆栈上加载静态字段。 通过发出此模式,我可以在Mono 2.10.6上重现该问题和NRE。 好消息是它已在master中修复。 当您可以访问JInt的代码时,为了防止发生NRE,可以将else分支修改为以下内容:

    code.Emit(OpCodes.Ldsfld,typeof(JsUndefined).GetField(“ Instance”)));

这会带你去。

ldfld应该始终带有一个参数,否则您将获得无效的CLR,并且运行时环境应拒绝加载它(加载时格式错误的CIL抛出异常的程序集)。

我认为,由于某种原因,作为ldfld参数的字段引用不能在运行时解析(尽管在创建代码时就存在)。 一方面,这就是为什么您在IDE中获得不带参数的ldfld原因(它无法显示类型,因为它无法加载它),另一方面,在执行此特定行时会得到null异常。

您确定动态创建的程序集正确引用了包含JsUndefined类型的程序集吗? 代码生成器可以看到它,但是生成的代码可以看到它吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM