怎么从c#里传byte[] 数据到unmanaged c++的dll里 20
有一个用opencv写的dll,里面有一个函数定义如下:voidGetHeadGesture(constunsignedchar*pImgData,int&getsure...
有一个用opencv写的dll, 里面有一个函数 定义如下:
void GetHeadGesture(const unsigned char * pImgData, int & getsureType);
现在需要在c#里调用这个DLL.在c#里定义引用如下:
[DllImport("HeadGestureDll.dll", EntryPoint = "?GetHeadGesture@@YAXPBEAAH@Z")]
private static extern void GetHeadGesture([In]byte[] pImgData, [Out] int getsureType);
在程序中用时:
int type = -2;
byte[] imageData = new byte[BufferLen];
Marshal.Copy(pBuffer, imageData, 0, BufferLen);
//pBuffer 是一个IntPtr指向存放数据的buffer, BufferLen是Buffer的长度.
GetHeadGesture(imageData, type);
这样子写编译的时候没问题. 但是在运行的时候, 就出错了. GetHeadGesture出错, DLL里发生错误: Incorect size of input array (Non-positive cols or rows) in function cvInitMatHeader
我不怎么用c#, 请各位大侠指教, 我这样写对不对. 谢谢.
我自己想办法解决了.
在c#里定义函数成这样:
[DllImport("HeadGestureDll.dll", EntryPoint = "?GetHeadGesture@@YAXPBEAAH@Z")]
private static extern void GetHeadGesture(byte[] pImgData, ref int getsureType);
然后在程序中的调用方法和上面提到的一样.这样就可以了, 在DLL里可以正常接收数据.
===================================================================================
谢谢 Kingson88.
照你说的, 我改成下面这样
现在需要在c#里调用这个DLL.在c#里定义引用如下:
[DllImport("HeadGestureDll.dll", EntryPoint = "?GetHeadGesture@@YAXPBEAAH@Z")]
private static extern void GetHeadGesture(IntPtr pImgData, [Out] int getsureType);
在程序中用时:
//pBuffer 是一个IntPtr指向存放数据的buffer, BufferLen是Buffer的长度.
GetHeadGesture(pBuffer, type);
好像还是不可以啊. 展开
void GetHeadGesture(const unsigned char * pImgData, int & getsureType);
现在需要在c#里调用这个DLL.在c#里定义引用如下:
[DllImport("HeadGestureDll.dll", EntryPoint = "?GetHeadGesture@@YAXPBEAAH@Z")]
private static extern void GetHeadGesture([In]byte[] pImgData, [Out] int getsureType);
在程序中用时:
int type = -2;
byte[] imageData = new byte[BufferLen];
Marshal.Copy(pBuffer, imageData, 0, BufferLen);
//pBuffer 是一个IntPtr指向存放数据的buffer, BufferLen是Buffer的长度.
GetHeadGesture(imageData, type);
这样子写编译的时候没问题. 但是在运行的时候, 就出错了. GetHeadGesture出错, DLL里发生错误: Incorect size of input array (Non-positive cols or rows) in function cvInitMatHeader
我不怎么用c#, 请各位大侠指教, 我这样写对不对. 谢谢.
我自己想办法解决了.
在c#里定义函数成这样:
[DllImport("HeadGestureDll.dll", EntryPoint = "?GetHeadGesture@@YAXPBEAAH@Z")]
private static extern void GetHeadGesture(byte[] pImgData, ref int getsureType);
然后在程序中的调用方法和上面提到的一样.这样就可以了, 在DLL里可以正常接收数据.
===================================================================================
谢谢 Kingson88.
照你说的, 我改成下面这样
现在需要在c#里调用这个DLL.在c#里定义引用如下:
[DllImport("HeadGestureDll.dll", EntryPoint = "?GetHeadGesture@@YAXPBEAAH@Z")]
private static extern void GetHeadGesture(IntPtr pImgData, [Out] int getsureType);
在程序中用时:
//pBuffer 是一个IntPtr指向存放数据的buffer, BufferLen是Buffer的长度.
GetHeadGesture(pBuffer, type);
好像还是不可以啊. 展开
2个回答
展开全部
void GetHeadGesture(const unsigned char * pImgData, int & getsureType);
pImgData这个是指种,大小32位的。你要传个指种下去。C#里的指种是IntPtr,你定义一个指种。然后这个指种指向这个数组。然后再传指种调用。我很久以前做过,。现在不大记得了,或者你把数组的第一个字节 按ref imageData【0】这样传进去试下。
[DllImport("HeadGestureDll.dll", EntryPoint = "?GetHeadGesture@@YAXPBEAAH@Z")]
private static extern void GetHeadGesture(ref byte pImgData, [Out] int getsureType); 这样不行的话一定要用IntPtr,至于怎么把这个IntPtr指种指向数组我就不记得了。你网上查下
const unsigned char * pImgData,你确定是字节数组吗?我看怎么想字符。
private static extern void GetHeadGesture(ref string pImgData, [Out] int getsureType); 很久以前做过这样的。经常试各种类型,C#调用C++主要就是类型转换比较麻烦。你去查查看C#与C++类型对照表。char 好像对于C# string
pImgData这个是指种,大小32位的。你要传个指种下去。C#里的指种是IntPtr,你定义一个指种。然后这个指种指向这个数组。然后再传指种调用。我很久以前做过,。现在不大记得了,或者你把数组的第一个字节 按ref imageData【0】这样传进去试下。
[DllImport("HeadGestureDll.dll", EntryPoint = "?GetHeadGesture@@YAXPBEAAH@Z")]
private static extern void GetHeadGesture(ref byte pImgData, [Out] int getsureType); 这样不行的话一定要用IntPtr,至于怎么把这个IntPtr指种指向数组我就不记得了。你网上查下
const unsigned char * pImgData,你确定是字节数组吗?我看怎么想字符。
private static extern void GetHeadGesture(ref string pImgData, [Out] int getsureType); 很久以前做过这样的。经常试各种类型,C#调用C++主要就是类型转换比较麻烦。你去查查看C#与C++类型对照表。char 好像对于C# string
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询