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

发布于 2024-07-12 00:45:55 字数 108 浏览 7 评论 0原文

你看,我绝对是个初学者。 假设我在堆栈上有一个字符串对象,并且想要获取其中的字符数 - 它的 .Length 属性。 我怎样才能得到隐藏在里面的int32数字?

提前谢谢了!

I'm an absolute beginner, you see. Say I have a string object on the stack and want to get the number of characters in it - its .Length property. How would I get the int32 number hidden inside?

Many thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

探春 2024-07-19 00:45:55

伊利诺伊州确实没有房产这样的东西。 只有字段和方法。 C# 属性构造由编译器转换为 get_PropertyNameset_PropertyName 方法,因此您必须调用这些方法来访问属性。

代码 IL 的示例(调试)IL

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

正如

  .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 来访问 Length 属性。

There's really no such thing as properties in IL. There are only fields and methods. The C# property construct is translated to get_PropertyName and set_PropertyName methods by the compiler, so you have to call these methods to access the property.

Sample (debug) IL for code

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

As you can see the Length property is accessed via the call to get_Length.

赢得她心 2024-07-19 00:45:55

我作弊了...我拿了以下 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 
}

I cheated ... I took the following C# code and took a look at it in ildasm/Reflector

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

is equivalent to

.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 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文