将一个字节数组从C#传递到C++填充数组的C++com对象中
本文关键字:数组 C++ 填充 对象 C++com 一个 字节数 字节 | 更新日期: 2023-09-27 18:23:52
我需要将一个字节数组从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);