日期:2014-05-20  浏览次数:20713 次

il指令中,call一个构造函数和newobj一个对象的结果为啥不一样?(了解IL的情帮助)
.assembly extern mscorlib { auto }
.assembly extern System { auto }
.assembly MyApp {}

.class MyClass
{
  .field int32 X
  
  .method public specialname void .ctor()
  {  
  ldarg.0
  call instance void [mscorlib]System.Object::.ctor()
   
  ldarg.0
  ldc.i4 10
  stfld int32 MyClass::X
   
  ret
  }
}

.method static void Test()
{
  .locals init (class MyClass mc)

  //***********************************
  ldloca mc
  call instance void MyClass::.ctor()

  ldloc mc
  ldfld int32 MyClass::X ///---这句会报错“Object reference not set to an instance of an object.“
  //***********************************
  pop
  ret
}

如果我把上面框住的换成这样
  //***********************************
  ldloca mc
  call instance void MyClass::.ctor()

  ldloca mc //这里换成了ldloca
  ldfld int32 MyClass::X  
  //***********************************
就可以通过了,为什么呢?

另外如果我换成
  //***********************************
  newobj instance void MyClass::.ctor()
  stloc mc
   
  ldloc mc
  //ldloca mc
  ldfld int32 MyClass::X  
  //***********************************
那么无论是ldloc mc 还是ldloca mc 都可以通过,为什么呢?




------解决方案--------------------
两个ldloca居然能通过,不解。。。
MSIL code
     //***********************************
     ldloc mc      //这里换成了ldloc
     call instance void MyClass::.ctor()

     ldloc mc      //这里不变
     ldfld int32 MyClass::X
     //***********************************