使用C ++填充数组将C#中的字节数组传递给C ++ com对象

时间:2012-02-08 15:41:13

标签: c# c++ .net com interop

我需要将一个字节数组传递给C#中的C ++ com对象。然后C ++将填充缓冲区以供C#读取。

c ++函数定义

STDMETHODIMP CSampleGrabber::GetBuffer(byte* bd)
{
    int p=0;
    while (p< nBufSize) {
        bd[p]=pLocalBuf[p];
        p++;
    }

c#c​​ode:

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

由于

2 个答案:

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