You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换到.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中所有涉及指针转整数的代码:

  1. 找到所有调用IntPtr.ToInt32()的位置,替换为IntPtr.ToInt64()(如果必须用整数存储指针地址),或者直接使用IntPtr类型操作内存,避免类型转换。
    比如原代码中:

    int sharedMemAddr = m_SharedMem.ToInt32();
    

    改为:

    long sharedMemAddr = m_SharedMem.ToInt64();
    
  2. 对于通过指针读取结构体的代码,直接使用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));
    
  3. 检查所有涉及内存偏移、句柄操作的变量,将原本的int类型改为long,确保能容纳64位地址值。

修改完成后,代码即可在64位.NET 5进程中正常运行,捕获OutputDebugString输出。

内容的提问来源于stack exchange,提问作者123iamking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:52:43