首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET Framework >

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

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

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     //*********************************** 

热点排行