Получить адрес первого элемента массива, хранящегося в виде объекта - PullRequest
1 голос
/ 31 декабря 2011

Мне нужно получить адрес памяти первого элемента массива произвольного типа, который хранится как тип объекта. Например, массив может быть 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 Ответ

4 голосов
/ 31 декабря 2011

Этого можно добиться, используя 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();
    }
}

Просто убедитесь, что вам это действительно нужно.

...