我正在尝试运行此项目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。
对于我来说
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 位系统上正确处理指针算术。