如何通过它在C#中的偏移量来访问字段值

时间:2017-12-01 17:23:15

标签: c# clr

public class Test
{
    int m_iInt1; // 0x0
    int m_iInt2; // 0x4
}

C#中是否可以访问这样的字段:

var inst = new Test();
unsafe 
{
    var reference = __makeref(inst);
    int int1 = *(int*)(reference + 0x0);
}

我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

  

你做不到。

我可以

var inst = new Test();
unsafe
{
    var reference = __makeref(inst); // could also be retrieved with GCHandle.Alloc
    IntPtr ptr = **(IntPtr**)(&reference);
    int* x = (int*)ptr;
    Console.WriteLine(x[1]); // prints m_iInt1
    Console.WriteLine(x[2]); // prints m_iInt2
    Console.WriteLine(*(int*)((int)ptr + 0x4)); // same as above
    Console.WriteLine(*(int*)((int)ptr + 0x8));
}

我认为*(int*)((int)ptr + 0x0)是方法表指针,如下所述:http://blogs.microsoft.co.il/sasha/2012/03/15/virtual-method-dispatch-and-object-layout-changes-in-clr-40/http://yonifedaeli.blogspot.com/2017/03/sync-block-index-sbi-object-header-word.html

这仅仅是出于教育目的,我知道这些东西不能用于普通的软件。这可以用于很多我不会在这里详述的内容。

答案 1 :(得分:-1)

假设你的情景:

var fields = typeof(Test).GetFields();
int i = fields[0].GetValue(inst);

这会起作用

如果您让我们更深入地了解您的用例,可以为您提供更多帮助:)