【发布时间】:2020-07-29 19:16:25
【问题描述】:
我正在创建一个 .Net 中间代码仿真器,它在指令之后执行 CIL 指令。
我无法更精确地模拟 call instance void valuetype 并保存其结果
我有 C# 代码:DateTime? startDate = DateTime.Now;
编译为:
IL_010d: ldloca.s startDate
IL_010f: call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
IL_0114: call instance void valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.DateTime>::.ctor(!0/*valuetype [mscorlib]System.DateTime*/)
- 在
IL_010d-ldloca上推送对局部变量startDate的堆栈引用 - 在
IL_010f-call上推送堆栈值类型 DateTime==Now
我的第一个问题是:IL_0114 发生了什么?执行 call 方法后堆栈应该是什么样子?如何将DateTime.Now 值输入到本地startData 变量中?在什么时候输入?
如果我将 C# 代码更改为 DateTime startDate = DateTime.Now;(不带?)
编译为:
IL_010d: call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
IL_0112: stloc.2 // startDate
- 在
IL_010d-call将值压入堆栈 - 在
IL_0112-stloc从堆栈中弹出值并保存在局部变量中
在这种情况下,一切对我来说都很清楚。即执行块后,栈上没有对象,DateTime.Now已写入局部变量startDate。
我的第二个问题是这两个调用有什么区别?
call instance void valuetype(IL_0114) 与 call valuetype(IL_010d)
【问题讨论】:
标签: c# cil mono.cecil