切换到.NET Core时MapViewOfFile指针抛出OverflowException异常

问题描述 投票:0回答:1

我正在尝试运行此项目DbMon.NET - .NET Core (.NET 5.0) 中的简单 .NET OutputDebugString 捕获器

它在 .NET 4.7.2 中运行良好,但是当我切换到 .NET 5 时,我不断遇到异常

System.OverflowException:算术运算导致溢出。

System.IntPtr.ToInt32()

抛出

详情如下:

  • 第1步:下载DbMon.NET源代码

  • 第 2 步:将文件

    DebugMonitor.cs
    添加到我的 .NET 5.0 控制台项目。

  • 第3步:我在文件

    DebugMonitor
    中执行
    Program.cs
    ,如下所示:

          static void Main(string[] args)
          {
              DebugMonitor.OnOutputDebugString += new OnOutputDebugStringHandler(PrintDebugString);
              DebugMonitor.Start();
    
              Console.Read();
              DebugMonitor.Stop();
          }
    
          private static void PrintDebugString(int id, string szMsg)
              => Console.WriteLine("{0} - {1}", id, szMsg);
    
  • 第4步:运行项目。该代码总是在文件

    m_SharedMem.ToInt32()
    中的
    DebugMonitor.cs
    处抛出异常。
    m_SharedMem
    的值为
    m_SharedMem = MapViewOfFile(m_SharedFile, SECTION_MAP_READ, 0, 0, 512);

例外情况是:

System.OverflowException:算术运算导致溢出

在步骤 2 中,如果我使用 .NET 4.7.2 而不是 .NET 5.0,则不会出现异常。所以我猜 .NET 5.0 可能需要设置一些安全规则或其他东西,我有这个这个问题(MemoryMappedFile low-integrity .Net 5),但还没有弄清楚如何在 .NET 5.0 中修复这个 DbMon.Net。

c# .net windows .net-core winapi
1个回答
0
投票

对于我来说

m_SharedMem = MapViewOfFile(m_SharedFile, SECTION_MAP_READ, 0, 0, 512);

等于 0x000001be0c310000,注意它不是 8 个十六进制,而是 0x 之后的 16 个十六进制字符,并且您正在使用 IntPtr32。

因此,System.OverflowException 是因为 IntPtr.ToInt32() 无法处理超出 32 位整数范围的值(通常在 64 位系统上)。

而是使用

IntPtr.ToInt64()
在 64 位系统上正确处理指针算术。

© www.soinside.com 2019 - 2024. All rights reserved.