首页 / C# / C#尝试读取或写入受保护的内存错误
C#尝试读取或写入受保护的内存错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#尝试读取或写入受保护的内存错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1531字,纯文字阅读大概需要3分钟。
内容图文
附录:当我取消选中“优化代码”时,它似乎可以正常运行,这使我相信这是一些古怪的配置问题
首先,我试图运行非托管代码.我检查了“允许不安全的代码”.它指向此行代码,在这里我尝试在不使用相对较慢的getpixel的情况下读取位图:
byte[] buff = { scanline[xo], scanline[xo + 1], scanline[xo + 2], 0xff };
整个摘要如下.我该如何解决这个问题?
private const int PIXELSIZE = 4; // Number of bytes in a pixel
BitmapData mainImageData = mainImage.LockBits(new Rectangle(0, 0, mainImage.Width, mainImage.Height), ImageLockMode.ReadOnly, mainImage.PixelFormat);
List<Point> results = new List<Point>();
foundRects = new List<Rectangle>();
for (int y = 0; y < mainImageData.Height
{
byte* scanline = (byte*)mainImageData.Scan0 + (y * mainImageData.Stride);
for (int x = 0; x < mainImageData.Width; x++)
{
int xo = x * PIXELSIZE;
byte[] buff = { scanline[xo], scanline[xo + 1],
scanline[xo + 2], 0xff };
int val = BitConverter.ToInt32(buff, 0);
// Pixle value from subimage in desktop image
if (pixels.ContainsKey(val) && NotFound(x, y))
{
Point loc = (Point)pixels[val];
int sx = x - loc.X;
int sy = y - loc.Y;
// Subimage occurs in desktop image
if (ImageThere(mainImageData, subImage, sx, sy))
{
Point p = new Point(x - loc.X, y - loc.Y);
results.Add(p);
foundRects.Add(new Rectangle(x, y, subImage.Width,
subImage.Height));
}
}
}
解决方法:
有限的信息很难说,但是我看到了几个明显的问题,其中一个直接解决了您的问题:
>您不在检查像素格式,而是假设它是32bppRGB.可能是24bppRGB,这可以解释该错误.
>您读取的RGB值不正确; Windows在内部以BGR顺序存储位图.
>您不会在方法末尾调用UnlockBits.
内容总结
以上是互联网集市为您收集整理的C#尝试读取或写入受保护的内存错误全部内容,希望文章能够帮你解决C#尝试读取或写入受保护的内存错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。