Tag: unmanaged memory

没有拳击的Marshal.StructureToPtr

有没有办法将一个结构(可能存储在TypedReference中 )编组到非托管内存而不实际装箱? 结构的类型在运行时是未知的,因此我不能使用StructureToPtr(.NET 4.5.1)的generics重载。 我可以获得StructureToPtr重载的MethodInfo,但似乎没有办法调用它来传递generics引用或TypedReference 。 编辑:通用的StructureToPtr仍然对结构进行封装,因此尝试调用它是没用的。

直接读取和写入Unlocked Bitmap非托管内存(Scan0)

从解锁的Bitmap非托管内存直接写入和读取是否可以? 在我解锁Bitmap后,我可以继续使用BitmapData吗? 我做了一个测试应用程序,我可以在鼠标位置读取PictureBox的Bitmap像素,而另一个线程正在将像素写入同一个Bitmap。 编辑1:正如Boing在他的回答中指出的那样:“Scan0没有指向Bitmap对象的实际像素数据;而是指向一个临时缓冲区,它表示Bitmap对象中像素数据的一部分。” 来自MSDN 。 但是一旦我获得Scan0,我就能够读取/写入位图而无需Lockbits或UnlockBits! 我在一个post里做了很多次。 相对于MSDN,它不应该发生,因为Scan0指向位图数据的COPY! 好吧,在C#中,所有测试都显示它不是副本。 在C ++中,我不知道它是否正常工作。 编辑2:使用旋转方法有时会使操作系统释放位图像素数据副本。 结论, it is not safe to read/write an unlocked Bitmap Scan0 。 谢谢Boing的回答和评论! 下面是我如何获取BitmapData并读取和写入像素值。 /// /// Locks and unlocks the Bitmap to get the BitmapData. /// /// Bitmap /// BitmapData public static BitmapData GetBitmapData(Bitmap bmp) { BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, […]