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

Eug*_*yos 1 .net c# reflection unsafe managed

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

虽然获取已知类型数组的地址很简单,但在 C# 中不允许获取对象的地址。是否有一种类型(Object 除外)可以用来存储这样的数组,并且可以更轻松地获取其内存地址?或者有没有办法使用互操作/反射直接访问地址而无需中间数据副本?

请注意,在下面的第二行中,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...
                }

    }
Run Code Online (Sandbox Code Playgroud)

max*_*max 5

您可以使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

只要确定你真的需要这个。