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

我正在为monodevelop中linux(Ubuntu)下的Basler摄像头的C/C++挂架库编写一个简单的.NET包装器。我正在Code::Blocks中构建一个.so(.dll)文件,并在monodevelop中P/Invoke它。 我有两个简单的任务:获取单个图像和一系列图像

我以这种方式管理第一部分:

在C++中,我有一个函数:

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);