[英]Passing a byte array from C# into C++ com object with C++ filling array
我需要将一个字节数组传递给C#中的C ++ com对象。 然后C ++将填充缓冲区以供C#读取。
c ++函数定义
STDMETHODIMP CSampleGrabber::GetBuffer(byte* bd)
{
int p=0;
while (p< nBufSize) {
bd[p]=pLocalBuf[p];
p++;
}
c#代码:
byte[] byTemp = new byte[nBufSize];
igb.GetBuffer(ref byTemp);
这个程序毫无例外地崩溃了。 请有人帮忙。 谢谢
解决了:
同
byte[] byTemp = new byte[nBufSize];
GCHandle h = GCHandle.Alloc(byTemp, GCHandleType.Pinned);
igb.GetBuffer(h.AddrOfPinnedObject());
谢谢
该参数不应声明为ref
。 你想要的东西:
uint GetBuffer(byte[] bd);
如果你包含ref
那么当你只需要数组时,你会传递一个指向数组的指针。 (并且通过数组,我指的是指向第一个元素的指针。)
我知道这是一个老问题,但谷歌把我带到这里,所以它可能带来其他人。 如果你使用P / Invoke来调用:
... GetBuffer(byte* bd)
它应该看起来像是一些东西
[DllImport("MyDll.dll")]
... GetBuffer(ref byte bd);
并且应该像这样传入c#中的缓冲区数组:
var arr = new byte[Length];
GetBuffer(ref arr[0]);
这也适用于char*
,因为你可以传入相同的byte
数组引用,然后使用string s = Encoding.<encoding>.GetString(arr);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.