当前位置: 首页 > 编程语言 > C#

如何使用P - Invoke将MemoryStream数据传递给非托管C ++ DLL分享

时间:2023-04-11 11:35:44 C#

C#学习教程:如何使用P/Invoke将MemoryStream数据传递给非托管C++DLL在从硬件读取一些数据到MemoryStream(C#)时,我需要将内存中的这些数据传递给在非托管C++中实现的dll(使用指针??)。读取(流入)的数据非常大(兆字节)。我知道我可以P/Invoke这个dll,但我不确定如何将流数据的指针/引用传递给C++API?我必须承认我很困惑,因为我是C#的新手——我是否需要使用unsafe/fixed因为数据很大或者这些不相关,因为MemoryStream对象由GC管理?一些示例代码/详细描述将非常有帮助。感谢非托管API的签名:BOOLdoSomething(void*rawData,intdataLength)如果它只是期望字节,您可以将MemoryStream读入字节数组,然后将指针传递给该方法。您必须声明外部方法:[DllImport("mylibrary.dll",CharSet=CharSet.Auto)]publicstaticexternbooldoSomething(IntPtrrawData,intdataLength);然后,将MemoryStream中的字节读入字节数组。分配GCHandle:分配后,您可以使用GCHandle来防止垃圾收集器在非托管客户端具有唯一引用时收集托管对象。如果没有这样的句柄,垃圾收集器可以在代表非托管客户端完成其工作之前收集该对象。最后,使用AddrOfPinnedObject方法将IntPtr传递给C++dll。以上就是C#学习教程:HowtouseP/InvoketopassMemoryStreamdatatotheunmanagedC++DLL。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注—privatevoidCallTheMethod(MemoryStreammemStream){byte[]rawData=newbyte[memStream.Length];memStream.Read(rawData,0,memStream.Length);GCHandlerawDataHandle=GCHandle.Alloc(rawData,GCHandleType.Pinned);IntPtraddress=handle.AddrOfPinnedObject();doSomething(地址,rawData.Length);rawDataHandle.Free();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢