将一个字节数组从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());

感谢

将一个字节数组从C#传递到C++填充数组的C++com对象中

参数不应声明为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);