如何在CIL(MSIL)中访问对象属性?

时间:2009-01-20 19:31:44

标签: properties cil

你知道,我是一个绝对的初学者。假设我在堆栈上有一个字符串对象,并希望获得其中的字符数 - 它的.Length属性。我如何将int32号隐藏在里面?

非常感谢提前!

2 个答案:

答案 0 :(得分:3)

在IL中真的没有属性这样的东西。只有字段和方法。 C#属性构造由编译器转换为get_PropertyNameset_PropertyName方法,因此您必须调用这些方法来访问该属性。

示例(调试)IL代码

var s = "hello world";
var i = s.Length;

IL

  .locals init ([0] string s,
           [1] int32 i)
  IL_0000:  nop
  IL_0001:  ldstr      "hello world"
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  callvirt   instance int32 [mscorlib]System.String::get_Length()
  IL_000d:  stloc.1

正如您所见,通过调用get_Length来访问“长度”属性。

答案 1 :(得分:0)

我作弊了......我拿了下面的C#代码并在ildasm / Reflector中查看了它

static void Main(string[] args)
{
    string h = "hello world";
    int i = h.Length;
}

相当于

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string h,
        [1] int32 i)
    L_0000: nop 
    L_0001: ldstr "hello world"
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: callvirt instance int32 [mscorlib]System.String::get_Length()
    L_000d: stloc.1 
    L_000e: ret 
}