切换到.NET Core时MapViewOfFile指针抛出OverflowException异常
解决.NET 5中DbMon.NET的System.OverflowException异常问题
问题根源
你遇到的System.OverflowException是因为.NET 5默认以64位进程运行,此时IntPtr类型占用8字节(对应64位内存地址)。而DbMon.NET的原始代码是针对32位.NET Framework编写的,调用IntPtr.ToInt32()会将64位指针值强行转换为32位整数,超出32位整数的取值范围,从而触发溢出异常。
解决方案
方案一:强制项目以32位(x86)运行
这是最快捷的解决方式,直接对齐原来.NET Framework 4.7.2的运行环境:
- 右键你的.NET 5控制台项目 → 属性 → 生成选项卡
- 在平台目标下拉菜单中选择
x86 - 保存设置后重新编译运行,异常即可消失
方案二:修改代码适配64位进程
如果需要保留64位运行模式,需要修改DebugMonitor.cs中所有涉及指针转整数的代码:
找到所有调用
IntPtr.ToInt32()的位置,替换为IntPtr.ToInt64()(如果必须用整数存储指针地址),或者直接使用IntPtr类型操作内存,避免类型转换。
比如原代码中:int sharedMemAddr = m_SharedMem.ToInt32();改为:
long sharedMemAddr = m_SharedMem.ToInt64();对于通过指针读取结构体的代码,直接使用
IntPtr作为参数,无需转换为整数:
原代码可能类似:DEBUGMONITOR_DATA data = (DEBUGMONITOR_DATA)Marshal.PtrToStructure(new IntPtr(m_SharedMem.ToInt32()), typeof(DEBUGMONITOR_DATA));修改为:
DEBUGMONITOR_DATA data = (DEBUGMONITOR_DATA)Marshal.PtrToStructure(m_SharedMem, typeof(DEBUGMONITOR_DATA));检查所有涉及内存偏移、句柄操作的变量,将原本的
int类型改为long,确保能容纳64位地址值。
修改完成后,代码即可在64位.NET 5进程中正常运行,捕获OutputDebugString输出。
内容的提问来源于stack exchange,提问作者123iamking
相关产品推荐
相关产品推荐

