【问题标题】:Invalid IL code in XXX(): IL_0023: brfalse IL_00baXXX() 中的 IL 代码无效:IL_0023: brfalse IL_00ba
【发布时间】:2015-08-15 19:23:31
【问题描述】:

我试图了解为什么这是无效的 IL 代码和/或会导致此错误的原因。

抛出的异常是:

System.InvalidProgramException:IL 代码无效 away3d.containers.View3D:updateBackBuffer (): IL_0023: brfalse
IL_00ba

我使用 monodis 进行了反汇编,下面是被调用的方法 (updateBackBuffer) 并引发错误,但我无法发现 branch if false 语句或其周围的 IL 有任何问题:

// method line 841
.method family virtual hidebysig newslot 
       instance default void updateBackBuffer ()  cil managed 
{
    // Method begins at RVA 0x1e4d4
// Code size 226 (0xe2)
.maxstack 5
IL_0000:  nop 
IL_0001:  ldarg.0 
IL_0002:  ldfld class away3d.core.managers.Stage3DProxy away3d.containers.View3D::_stage3DProxy
IL_0007:  callvirt instance class [pscorlib_monomac]flash.display3D.Context3D class away3d.core.managers.Stage3DProxy::get_context3D()
IL_000c:  brfalse IL_00e1

IL_0011:  ldarg.0 
IL_0012:  ldfld bool away3d.containers.View3D::_shareContext
IL_0017:  brtrue IL_00e1

IL_001c:  nop 
IL_001d:  ldarg.0 
IL_001e:  ldfld float64 away3d.containers.View3D::_width
IL_0023:  brfalse IL_00ba

IL_0028:  ldarg.0 
IL_0029:  ldfld float64 away3d.containers.View3D::_height
IL_002e:  brfalse IL_00ba

IL_0033:  nop 
IL_0034:  ldarg.0 
IL_0035:  ldfld class away3d.core.managers.Stage3DProxy away3d.containers.View3D::_stage3DProxy
IL_003a:  callvirt instance bool class away3d.core.managers.Stage3DProxy::get_usesSoftwareRendering()
IL_003f:  brfalse IL_008c

IL_0044:  nop 
IL_0045:  ldarg.0 
IL_0046:  ldfld float64 away3d.containers.View3D::_width
IL_004b:  ldc.r8 2048.
IL_0054:  ble.un IL_0068

IL_0059:  ldarg.0 
IL_005a:  ldc.r8 2048.
IL_0063:  stfld float64 away3d.containers.View3D::_width
IL_0068:  ldarg.0 
IL_0069:  ldfld float64 away3d.containers.View3D::_height
IL_006e:  ldc.r8 2048.
IL_0077:  ble.un IL_008b

IL_007c:  ldarg.0 
IL_007d:  ldc.r8 2048.
IL_0086:  stfld float64 away3d.containers.View3D::_height
IL_008b:  nop 
IL_008c:  ldarg.0 
IL_008d:  ldfld class away3d.core.managers.Stage3DProxy away3d.containers.View3D::_stage3DProxy
IL_0092:  ldarg.0 
IL_0093:  ldfld float64 away3d.containers.View3D::_width
IL_0098:  conv.i4 
IL_0099:  ldarg.0 
IL_009a:  ldfld float64 away3d.containers.View3D::_height
IL_009f:  conv.i4 
IL_00a0:  ldarg.0 
IL_00a1:  ldfld unsigned int32 away3d.containers.View3D::_antiAlias
IL_00a6:  conv.i4 
IL_00a7:  ldc.i4.1 
IL_00a8:  callvirt instance void class away3d.core.managers.Stage3DProxy::configureBackBuffer(int32, int32, int32, bool)
IL_00ad:  ldarg.0 
IL_00ae:  ldc.i4.0 
IL_00af:  stfld bool away3d.containers.View3D::_backBufferInvalid
IL_00b4:  nop 
IL_00b5:  br IL_00e0

IL_00ba:  nop 
IL_00bb:  ldarg.0 
IL_00bc:  ldarg.0 
IL_00bd:  callvirt instance class [pscorlib_monomac]flash.display.Stage class [pscorlib_monomac]flash.display.DisplayObject::get_stage()
IL_00c2:  callvirt instance int32 class [pscorlib_monomac]flash.display.Stage::get_stageWidth()
IL_00c7:  conv.r8 
IL_00c8:  callvirt instance void class [pscorlib_monomac]flash.display.DisplayObject::set_width(float64)
IL_00cd:  ldarg.0 
IL_00ce:  ldarg.0 
IL_00cf:  callvirt instance class [pscorlib_monomac]flash.display.Stage class [pscorlib_monomac]flash.display.DisplayObject::get_stage()
IL_00d4:  callvirt instance int32 class [pscorlib_monomac]flash.display.Stage::get_stageHeight()
IL_00d9:  conv.r8 
IL_00da:  callvirt instance void class [pscorlib_monomac]flash.display.DisplayObject::set_height(float64)
IL_00df:  nop 
IL_00e0:  nop 
IL_00e1:  ret 
} // end of method View3D::updateBackBuffer

【问题讨论】:

    标签: mono cil reflection.emit mono.cecil


    【解决方案1】:

    也许是因为那个地方的加载值不是布尔值?

    【讨论】:

    • 脑残...我真的需要更多的咖啡。不确定我在哪里删除了双重转换(它以 ActionScript 编号开头)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多