相关疑难解决方法(0)

在非托管内存中托管类的标头的布局和大小是什么?

最近,在这个问题中,我已经问过如何在C#中获取类的原始内存地址(这是一个粗略的不可靠的黑客和一个不好的做法,除非你真的需要它,否则不要使用它).我成功了,但后来出现了一个问题:根据这篇文章,类原始内存表示中的前2个字应该是指向SyncBlock和RTTI结构的指针,因此第一个字段的地址必须偏移2个字 [ 8个字节 in 从一开始就是32位系统,64 位系统中的16个字节.但是,当我从对象位置的内存中转储第一个字节时,第一个字段与对象地址的原始偏移量只有1个32位字(4个字节),这对两种类型的系统都没有任何意义.从我链接的问题:

class Program
{
    // Here is the function.
    // I suggest looking at the original question's solution, as it is 
    // more reliable.
    static IntPtr getPointerToObject(Object unmanagedObject)
    {
        GCHandle gcHandle = GCHandle.Alloc(unmanagedObject, GCHandleType.WeakTrackResurrection);
        IntPtr thePointer = Marshal.ReadIntPtr(GCHandle.ToIntPtr(gcHandle));
        gcHandle.Free();
        return thePointer;
    }
    class TestClass
    {
        uint a = 0xDEADBEEF;
    }
    static void Main(string[] args)
    {
        byte[] cls = new byte[16];

        var test = new …
Run Code Online (Sandbox Code Playgroud)

c# reflection

6
推荐指数
1
解决办法
180
查看次数

标签 统计

c# ×1

reflection ×1