我需要将一个字节数组传递给C#中的C ++ com对象。然后C ++将填充缓冲区以供C#读取。
c ++函数定义
STDMETHODIMP CSampleGrabber::GetBuffer(byte* bd)
{
int p=0;
while (p< nBufSize) {
bd[p]=pLocalBuf[p];
p++;
}
c#code:
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());
由于
答案 0 :(得分:2)
不应将参数声明为ref
。你想要这样的东西:
uint GetBuffer(byte[] bd);
如果你包含ref
,那么你正在传递一个指向数组的指针,当你只想要数组时。 (并且通过数组,我指的是指向第一个元素的指针。)
答案 1 :(得分:0)
我知道这是一个老问题,但谷歌把我带到了这里,所以它可能会带来其他人。 如果您正在使用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);