Можно ли получить IntPtr из массива int[]?

Привет.

В С#: если у меня есть массив int[], объявленный следующим образом

int[] array = new array[size];

есть способ получить IntPtr из этого массива?

Дело в том, что я использую фреймворк EmguCV, и есть конструктор для создания изображения, которое принимает IntPtr к пиксельным данным, чтобы построить изображение из массива (int[]).

Image<Gray,Int32> result = new Image<Gray,int>(bitmap.Width,bitmap.Height,stride,"**array.toPointer??**");

Кстати, если бы кто-нибудь сказал мне, как рассчитать шаг, это было бы здорово.


person João Cardoso    schedule 10.02.2010    source источник
comment
C#. Извините, я забыл упомянуть   -  person João Cardoso    schedule 10.02.2010


Ответы (2)


Вы должны быть в состоянии сделать это без небезопасного кода, используя GCHandle. Вот пример:

GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned);
try
{
    IntPtr pointer = handle.AddrOfPinnedObject();
}
finally
{
    if (handle.IsAllocated)
    {
        handle.Free();
    }
}
person Bryan    schedule 10.02.2010
comment
Есть ли способ пойти наоборот, не копируя данные? - person jjxtra; 03.09.2015
comment
Это не копирование данных. Это говорит сборщику мусора, что вам нужен указатель на управляемый объект и не перемещайте его на меня (например, когда происходит сбор). - person Bryan; 03.09.2015
comment
Я имею в виду, можно ли создать управляемый массив без копирования неуправляемых данных - person jjxtra; 04.09.2015
comment
Это определенно то, как Microsoft делает это. - person Xcalibur37; 30.01.2016

Используйте небезопасный код, например:

unsafe
{
  fixed (int* pArray = array)
  {
    IntPtr intPtr = new IntPtr((void *) pArray);
  }
}
person Marcel Gheorghita    schedule 10.02.2010
comment
И, конечно же, обратите внимание, что intPtr указывает только на массив в то время как управление находится в фиксированном блоке. Как только вы покидаете фиксированный блок, сборщик мусора может снова перемещать pArray в памяти, и поэтому intPtr может указывать на мусор. - person Eric Lippert; 10.02.2010
comment
Что ж, хорошо, что этот intPtr виден только внутри фиксированного блока. - person Aleksei Petrenko; 31.07.2017
comment
Часто вы хотите передать указатель на какой-то неуправляемый код, куда вы все равно собираетесь копировать память. В таких случаях это правильное решение. - person Giacomo d'Antonio; 05.01.2021