Visual Studio 2015 x86调试8位PNG触发OutOfMemory异常问题
解决Visual Studio 2015 x86调试模式下8位PNG加载OutOfMemory异常的问题
我之前也碰到过一模一样的诡异问题!先帮你把问题再捋清楚:
- 在Visual Studio 2015的x86调试模式下,加载用Photoshop转成8位的PNG时会抛出
OutOfMemoryException,但加载原32位PNG完全正常; - 切换到Any CPU调试模式后,两种PNG都能正常运行;
- 两张图是同一图像,8位版本只是由32位转换而来;
- 抛出异常时,任务管理器显示内存占用还不到100MB,根本不存在真的内存不足;
- 更奇怪的是,如果先把图片添加到StackPanel中运行,居然又能正常工作?
问题根源
这其实是VS2015 x86调试环境的一个特定兼容性bug,和.NET Framework对8位索引色PNG的解码逻辑有关。x86模式下调试器的内存跟踪机制会和GDI+的PNG解码流程产生冲突——哪怕是Photoshop转换的PNG,也可能带了一些调试环境敏感的元数据,最终导致系统误报“内存不足”。
可行的解决方案
给你几个亲测有效的解决办法,你可以挨个尝试:
- 调整项目调试信息设置
右键项目→属性→生成→高级,把“调试信息”从「完整」改成「pdb-only」,然后清理项目并重新生成,很多时候就能直接解决这个误报问题。 - 手动绕开默认解码逻辑
不要直接用BitmapImage加载8位PNG,改用System.Drawing.Bitmap先解码再转成WPF可用的图像,避开GDI+的默认处理:using (var fileStream = new FileStream("你的8位PNG路径.png", FileMode.Open)) using (var ms = new MemoryStream()) { fileStream.CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); using (var gdiBitmap = new System.Drawing.Bitmap(ms)) { var wpfBitmap = new BitmapImage(); wpfBitmap.BeginInit(); using (var tempMs = new MemoryStream()) { gdiBitmap.Save(tempMs, System.Drawing.Imaging.ImageFormat.Png); tempMs.Seek(0, SeekOrigin.Begin); wpfBitmap.StreamSource = tempMs; wpfBitmap.CacheOption = BitmapCacheOption.OnLoad; wpfBitmap.EndInit(); } // 将wpfBitmap绑定到你的UI元素上即可 } } - 安装VS2015累积更新补丁
VS2015有几个针对调试器和.NET Framework兼容性的补丁,比如KB3165756,安装后能修复不少这类x86调试模式下的奇怪问题。 - 临时规避方案
如果只是开发阶段,暂时用Any CPU模式调试完全没问题,发布时再根据需求切换回x86即可——毕竟发布版本不会受到调试器内存跟踪机制的干扰。
内容的提问来源于stack exchange,提问作者KMC
相关产品推荐
相关产品推荐

