从int[]数组中获取IntPtr是否可能?

12

你好。

在C#中:如果我声明了一个像这样的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??**");

顺便说一下,如果有人能告诉我如何计算步幅,那就太好了。


抱歉,我忘了提到 C#。 - João Cardoso
2个回答

23

你应该可以使用GCHandle来完成此操作,而不需要使用不安全的代码。下面是一个示例:

GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned);
try
{
    IntPtr pointer = handle.AddrOfPinnedObject();
}
finally
{
    if (handle.IsAllocated)
    {
        handle.Free();
    }
}

有没有不复制数据的情况下走另一条路的方法? - jjxtra
这不是复制数据。它是告诉GC您想要指向托管对象的指针,并且不要在移动它(例如当集合发生时)。 - Bryan
我的意思是是否可以创建一个托管数组而不复制非托管数据。 - jjxtra
这绝对是微软的做法。 - Xcalibur37
您不需要进行 handle.IsAllocated 检查,因为固定句柄会一直保持分配状态,直到被释放。如果构造函数已返回,则它肯定已经被分配。 - SWdV

10

使用不安全代码,就像这样:

unsafe
{
  fixed (int* pArray = array)
  {
    IntPtr intPtr = new IntPtr((void *) pArray);
  }
}

10
当然要注意,intPtr 只在 fixed 块内指向数组。一旦离开 fixed 块,垃圾回收器就可以再次自由地在内存中移动 pArray,并且 intPtr 可能会指向无用的数据。 - Eric Lippert
好在这个 intPtr 只在固定块内可见。 - Aleksei Petrenko
很多时候,您想将指针传递给一些未托管的代码,在那里您无论如何都要复制内存。在这些情况下,这是正确的解决方案。 - Giacomo d'Antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接