C# 在不安全的情况下重写锁位代码

C# 在不安全的情况下重写锁位代码,c#,unmanaged,C#,Unmanaged,如何在没有不安全修饰符的情况下重写此代码 var bmpData=bitmap.LockBits(新矩形(0,0,bitmap.Width,bitmap.Height),ImageLockMode.ReadOnly,bitmap.PixelFormat); var size=Math.Abs(bmpData.Stride)*位图.Height; var stream=新的非托管内存流((字节*)bmpData.Scan0,size)); 要获得对位图数据的透明高效访问(比任何带锁位的复制技术都快

如何在没有不安全修饰符的情况下重写此代码

var bmpData=bitmap.LockBits(新矩形(0,0,bitmap.Width,bitmap.Height),ImageLockMode.ReadOnly,bitmap.PixelFormat);
var size=Math.Abs(bmpData.Stride)*位图.Height;
var stream=新的非托管内存流((字节*)bmpData.Scan0,size));

要获得对位图数据的透明高效访问(比任何带锁位的复制技术都快),您可以使用以下技术,该技术不需要将代码标记为不安全(但需要完全信任):

  • 为位图数据创建一个
    字节[]
  • 用电话锁定它
  • 使用获取
    字节[]
    的物理地址
  • 使用以下命令在此基础上创建位图对象
  • 位图
    字节[]
重要提示:尽量避免长时间固定对象(妨碍GC效率),不要忘记在finally子句中处理位图和GC句柄


当然,如果您需要流,也可以使用它。

只需使用
MemoryStream
而不是非托管流。最终,锁位就是获取指向原始内存的指针,这从根本上说是一件不安全的事情。好的,它在IntPtr后面隐藏了void*,但它仍然是一个指针。@ppetrov是否有一个构造函数用于获取IntPtr?这似乎是一件不同寻常的事情:将流指向Scan0。你能澄清一下:你想在这里做什么吗?检查这篇文章中的VB示例(是的,我知道你问了一个C#问题,但是VB解决方案在Scan0上使用Marshal.ReadByte)