C# 非托管内存中的字节[]数组
我正在为monodevelop中linux(Ubuntu)下的Basler摄像头的C/C++挂架库编写一个简单的.NET包装器。我正在Code::Blocks中构建一个.so(.dll)文件,并在monodevelop中P/Invoke它。 我有两个简单的任务:获取单个图像和一系列图像 我以这种方式管理第一部分: 在C++中,我有一个函数:C# 非托管内存中的字节[]数组,c#,c++,mono,bytearray,pinvoke,C#,C++,Mono,Bytearray,Pinvoke,我正在为monodevelop中linux(Ubuntu)下的Basler摄像头的C/C++挂架库编写一个简单的.NET包装器。我正在Code::Blocks中构建一个.so(.dll)文件,并在monodevelop中P/Invoke它。 我有两个简单的任务:获取单个图像和一系列图像 我以这种方式管理第一部分: 在C++中,我有一个函数: void GetImage(void* ptr) { CGrabResultPtr ptrGrabResult; //here image
void GetImage(void* ptr)
{
CGrabResultPtr ptrGrabResult;
//here image is grabbing to ptrGrabResult
camera.GrabOne(5000,ptrGrabResult,TimeoutHandling_ThrowException);
//i'm copying byte array with image to my pointer ptr
memcpy(ptr,ptrGrabResult->GetBuffer(),_width*_height);
if (ptrGrabResult->GrabSucceeded())
return;
else
cout<<endl<<"Grab Failed;"<<endl;
}
然后,我可以从这个字节[]arr
构建一个图像
我必须复制大量的字节两次(1),在C++中代码> MycPyIE()/<代码> 2;我试图使用指向图像缓冲区的直接指针
ptr=ptrGrabResult->GetBuffer()
,但在编组字节时出现了mono环境错误
所以这里有一个问题:这是一个好的解决方案吗?我走的方向对吗
另外,请给我一些建议,我应该如何管理图像序列?您可以让编组员为您做这项工作。像这样:
[DllImport("libPylonInterface.so")]
private static extern void GetImage([Out] byte[] arr);
....
arr = new byte[_width * _height];
GetImage(arr);
这避免了第二次内存复制,因为封送拆收器将固定托管阵列并将其地址传递给非托管代码。然后,非托管代码可以直接填充托管内存
第一个副本看起来更难避免。这可能是您正在使用的相机库强加给您的。我想说的是,如果抓取成功,您可能应该只执行该复制
[DllImport("libPylonInterface.so")]
private static extern void GetImage([Out] byte[] arr);
....
arr = new byte[_width * _height];
GetImage(arr);