如果它只是期望字节,则可以将 MemoryStream 读入字节数组,然后将指向该数组的指针传递给该方法。
您必须声明外部方法:
[DllImport("mylibrary.dll", CharSet = CharSet.Auto)]
public static extern bool doSomething(IntPtr rawData, int dataLength);
然后,将 MemoryStream 中的字节读入一个字节数组。分配一个GCHandle,它:
分配后,您可以使用 GCHandle 在非托管客户端拥有唯一引用时防止垃圾收集器收集托管对象。如果没有这样的句柄,垃圾收集器可以在代表非托管客户端完成其工作之前收集对象。
最后,使用 AddrOfPinnedObject 方法获取 IntPtr 以传递给 C++ dll。
private void CallTheMethod(MemoryStream memStream)
{
byte[] rawData = new byte[memStream.Length];
memStream.Read(rawData, 0, memStream.Length);
GCHandle rawDataHandle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
try
{
IntPtr address = rawDataHandle.AddrOfPinnedObject ();
doSomething(address, rawData.Length);
}
finally
{
if (rawDataHandle.IsAllocated)
rawDataHandle.Free();
}
}