我在C#中有一个用于C ++函数的包装程序,该包装程序可以在32位中正常工作。该函数检测图像中的某些内容,因此我的C#伪代码如下所示。
void detect(image, detections){
detectCpp(ref image, ref detections);
}
当我以64位编译代码时,它将被C ++。dll自动捕获,但没有提供检测到的对象。如果我创建一个带有函数detectcCppBridge的C ++库,该函数调用detectCpp函数并改用新的函数/库,则会出现以下错误:
“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”
调用栈看起来像是detect-> detectCppBridge-> detectCpp:
当我将一个提示放到detectCppBridge中时,不会发生错误,并且一切正常。即使当我以某种方式使用detectCppBridge中的图像时,例如更改一个像素,也不会发生错误。
我认为C#的垃圾收集器会将图像丢弃,并且C ++函数希望访问它,尽管现在不存在了。我尝试将GCHandle.Alloc(image)与普通的和固定的handletypes一起使用,但是没有用。 你有什么建议吗?