获取存储为对象的数组的第一个元素的地址

时间:2011-12-30 22:15:33

标签: c# .net reflection managed unsafe

我需要获取任意类型数组的第一个元素的内存地址,该数组存储为一种Object类型。例如,数组可以是double []或int [],但在代码中它将被键入为Object。

虽然直接获取已知类型的数组的地址,但在C#中不允许获取对象的地址。是否有一个类型(除了Object)我可以用来存储这样一个数组,并且可以更容易地获得其内存地址?或者有没有办法使用Interop / Reflection直接访问地址而无需中间数据副本?

请注意,在下面的第二行中,double []存储为对象。并注意在fixed()行中我试图获取o的地址,这在C#中是不允许的。

提前致谢!

int len=100;
object o = new double [len];

   unsafe
   {
                fixed(int*ptr=&o)
                for (int index = 0; index < len; index++)
                {
                  // access data directly to copy it, etc...
                }

    }

1 个答案:

答案 0 :(得分:4)

您可以使用GCHandle

实现此目的
int len=100;
object x = new long[len];
unsafe
{
    var gch = GCHandle.Alloc(x, GCHandleType.Pinned);
    try
    {
        void* addr = (void*)gch.AddrOfPinnedObject();
        // do whatever you want with addr
    }
    finally
    {
        gch.Free();
    }
}

确定你真的需要这个。