我从www.lvr.com获得了一些示例代码,展示了如何使用WriteFile()和ReadFile()从USB设备写入/读取。在该示例中,Jan使用非托管内存作为WriteFile()和ReadFile()的参数。但是,似乎函数只能传递托管内存等效函数。
Public managedOverlapped As System.Threading.NativeOverlapped
Public nonManagedOverlapped As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(managedOverlapped))
Marshal.StructureToPtr(managedOverlapped, nonManagedOverlapped, False)
Public managedBuffer(64) As Byte
Public nonManagedBuffer As IntPtr = Marshal.AllocHGlobal(64)
api_status = ReadFile(readHandle, nonManagedBuffer, 64, BytesSucceed, nonManagedOverlapped)
和以下一样有效:
api_status = ReadFile(readHandle, managedBuffer, 64, BytesSucceed, managedOverlapped)
什么时候需要在WriteFile / ReadFile中使用非托管内存,或者一般在.Net中使用?
答案 0 :(得分:3)
当传递给本机函数时,Blittable类型(如字节)只是固定到位。 (参考:http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx)
如果参数不是blittable类型,则会在调用的生命周期内创建该对象的副本。对于较大的分配,这可能会很昂贵,因此您可以(根据自己的判断)直接分配非托管内存并将其传递给方法。