C#/CIL:本机int的类型

C#/CIL:本机int的类型,c#,cil,C#,Cil,我正在编写一些工具来帮助验证运行时发出的IL。此验证的一部分涉及在发出操作码时维护堆栈,以便将来使用这些堆栈元素的操作码可以使用正确的类型进行验证。但是,我对如何处理ldind.Iopcode感到困惑 Microsoft文档说明: ldind.i指令间接地从 将堆栈上的指定地址(类型为native int、&、或*)作为 本机整数 在C#中,未定义原生int,我不知道哪种类型最准确地表示此数据。我如何确定它的大小,以及应该使用哪种C类型来表示它?我担心它会因系统硬件的不同而有所不同。在我看来,您

我正在编写一些工具来帮助验证运行时发出的IL。此验证的一部分涉及在发出操作码时维护
堆栈
,以便将来使用这些堆栈元素的操作码可以使用正确的类型进行验证。但是,我对如何处理
ldind.I
opcode感到困惑

Microsoft文档说明:

ldind.i指令间接地从 将堆栈上的指定地址(类型为native int、&、或*)作为 本机整数


在C#中,未定义原生int,我不知道哪种类型最准确地表示此数据。我如何确定它的大小,以及应该使用哪种C类型来表示它?我担心它会因系统硬件的不同而有所不同。

在我看来,您最好看看VES是如何定义的,并使用专用枚举对堆栈上的类型进行建模,而不是C#可见类型。否则,当我们使用浮点类型时,您会大吃一惊

来自MS分区I.pdf1,第12.1节:

CLI模型使用求值堆栈[…],但是,CLI在对存储在其求值堆栈上的值进行操作时,仅支持这些类型的子集-
int32
int64
、以及
native int
。此外,CLI支持内部数据类型来表示内部计算堆栈上的浮点值。内部数据类型的大小取决于实现

因此,这些以及引用之类的东西是您应该跟踪的,我建议您使用VES堆栈的显式模型使用其术语来跟踪它们



1

a:没有,b:是的,它可能取决于硬件和运行时(x86/x64等);顺便说一句,您可能会发现(也)是您所寻找的一切,但已经构建并测试了C#中的IntPtr。它的“本机”之处在于,它的大小根据进程位的不同而变化,32位模式下为4字节,64位模式下为8字节。使其能够存储指针。从C#程序获取ldind.i需要fixed关键字通过指针访问IntPtr[]数组。这是不安全的代码,不可验证,没有边界检查。所以,请澄清,
ldind.i
本质上是取消引用指向本机指针的本机指针?例如,堆栈上的地址是
IntPtr**
?否,IntPtr*。IntPtr foo[]=新的IntPtr[1];已修复(IntPtr*p=&foo[0]){var value=*p;}更简单:IntPtr*p=null;var v=*p;