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