有没有办法从c#向本机函数发送SafeHandles数组?

有没有办法从c#向本机函数发送SafeHandles数组?,c#,marshalling,safehandle,C#,Marshalling,Safehandle,我有一个本机(c++)函数,它将指向图像的指针数组作为参数。在我的c#API中,指向图像的指针作为安全句柄保存。现在我想向我的函数发送一个SafeHandles数组,但随后出现以下错误 System.Runtime.InteropServices.MarshalDirectiveException:无法封送“参数#2”:无效的托管/非托管类型组合(不支持安全句柄数组)。 简化的代码如下所示: 本机端 int concatenate_images(Image **img_ref, Image **

我有一个本机(c++)函数,它将指向图像的指针数组作为参数。在我的c#API中,指向图像的指针作为安全句柄保存。现在我想向我的函数发送一个SafeHandles数组,但随后出现以下错误

System.Runtime.InteropServices.MarshalDirectiveException:无法封送“参数#2”:无效的托管/非托管类型组合(不支持安全句柄数组)。

简化的代码如下所示:

本机端

int concatenate_images(Image **img_ref, Image **images)
{
 // Concatenate the images and put the result in img_ref[0]
}
管理方

int concatenate_images(Image **img_ref, Image **images)
{
 // Concatenate the images and put the result in img_ref[0]
}
请注意,ImageHandle是从SafeHandle派生的

Image Concatenate(Image[] images)
{
 ImageHandle h = new ImageHandle(); 
 if (!concatenate_images(ref h, handles_array))
     throw new Exception("Failed concatenating images.");
 return new Image(h);
}

private static extern int concatenate_images(ref ImageHandle img_ref, [In, Out] ImageHandle [] images)
当然,我可以通过从SafeHandle中提取IntPtr并发送一个数组来解决这个问题 对象到我的本机函数。但据我所知,这样我就不会有SafeHande提供的额外安全


那么,我应该如何将对象发送到本机函数?我必须创建IntPtr数组还是有更好的方法?

有关如何将数组传递给本机代码的信息,请参见以下内容:@Anders
,这样我就不会有SafeHande提供的额外安全性了
-实际上,您不会丢失任何东西
SafeHandle
具有特殊机制,可确保本机句柄在采集(当句柄由本机代码生成但未存储在托管内存中时)和释放(当SafeHandle被销毁时)期间不会泄漏。它不能也不保护句柄表示的对象在其生命周期内发生的事件。如果通过IntPtr或不通过IntPtr将句柄值公开给本机代码,则设计上没有保护。c#代码调用窗口dll来创建安全句柄。你认为dll实际上是做什么的?很多人只了解应用层的功能,而不了解底层代码的实际功能。“安全句柄”添加了异常,这样,当访问范围之外的内存时,会出现异常,而不是您的计算机出现蓝屏。@jdweng似乎是您完全误解了该机制。Windows DLL不知道什么是
SafeHandle
。他们创建了一个指针大小的数字。C#编译器知道以特殊方式处理
SafeHandle
类型。当您在p/invoke声明中使用它时,编译器将注入代码,创建获取API返回的本机句柄的
SafeHandle
实例
SafeHandle
与以任何方式访问分配范围之外的内存无关。@GSerg:你认为SAFE这个词是什么意思?如果在分配的内存空间之外访问内存,则会创建异常。