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:
[DllImport("mylibrary.dll", CharSet = CharSet.Auto)]
public static extern bool doSomething(IntPtr rawData, int dataLength);
Then, read the bytes from the MemoryStream into a byte array. Allocate a GCHandle which:
Once allocated, you can use a GCHandle
to prevent the managed object from
being collected by the garbage
collector when an unmanaged client
holds the only reference. Without such
a handle, the object can be collected
by the garbage collector before
completing its work on behalf of the
unmanaged client.
And finally, use the AddrOfPinnedObject method to get an IntPtr to pass to the 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();
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…