当前位置: 代码迷 >> .NET Framework >> il指令中,call一个构造函数和newobj一个对象的结果为啥不一样?(了解IL的情帮助)解决方法
  详细解决方案

il指令中,call一个构造函数和newobj一个对象的结果为啥不一样?(了解IL的情帮助)解决方法

热度:80   发布时间:2016-05-02 00:49:42.0
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     //***********************************
  相关解决方案