问题描述
开发环境为win10+vs2019+net452,在win7+net452运行环境下,遇到根据结构体大小【Marshal.SizeOf(typeof(结构体))】分配内存【Marshal.AllocHGlobal(size)】,然后写入分配内存【Marshal.StructureToPtr(结构体, intPtr, true)】异常,try - catch 不能捕获,程序崩溃,在事件查看器中看到异常为AccessViolationException。
问题原因
从异常上理解,应该是分配的内存不够,导致写入对象越界。但是为什么根据结构体大小分配的会内存不够呢,对内存分配机制不了解,如有大神了解告知,不胜感激。
小的结构体不会有此异常,我遇到的报此异常的结构体,获取占用大小超过150K。
参考了这篇文章:https://www.cnblogs.com/yilang/p/11976576.html
解决办法
方法1:将运行框架升级到.net4.8,其他不做任何改动,问题自己消失【我是.net4.5.2框架开发的,其他的未测试】。
方法2:加大分配内存,我直接对分配的内存增加3倍【Marshal.AllocHGlobal(size * 3)】,问题消失。