I need your help with the following scenario:
I am reading some data from hardware into a MemoryStream (C#) and I need to pass this data in memory to a dll implemented in unmanaged C++ (using pointer ??).
The data read (into stream) is very large (megabytes). I understand that I can P/Invoke this dll but what I am not sure is how to pass the pointer / reference of the stream data to the C++ API ?
I must admit I am confused as I am new to C# – do I need to use unsafe / fixed since data is large or these are irrelevant as MemoryStream object is managed by GC ? Some example code / detailed description would be very helpful. Thanks
Signature of unmanaged API:
BOOL doSomething(void * rawData, int dataLength)
If it’s just expecting bytes you can read the MemoryStream into a byte array and then pass a pointer to that to the method.
You have to declare the external method:
Then, read the bytes from the MemoryStream into a byte array. Allocate a GCHandle which:
And finally, use the AddrOfPinnedObject method to get an IntPtr to pass to the C++ dll.