c# - GetSystemInfo() 为最大应用程序地址返回不同的值

标签 c# winapi

我想在 C# 中调用 Windows 的 GetSystemInfo() API 函数以检索 maximumApplicationAddressminimumApplicationAddress 以扫描内存电脑。

我写了一个输出这些值的简单程序:

SYSTEM_INFO sys_info = new SYSTEM_INFO();
GetSystemInfo(out sys_info);
Console.WriteLine("Min Address: {0:X}", sys_info.minimumApplicationAddress.ToUInt64());
Console.WriteLine("Max Address: {0:X}", sys_info.maximumApplicationAddress.ToUInt64());

当我运行这个程序时,通过调试器(使用“开始”按钮),它显示:

Min Address: 10000
Max Address: 7FFEFFFF

但是当我构建它并运行可执行文件时,它会显示:

Min Address: 10000
Max Address: FFFEFFFF

Max Addresses 之间的区别对我来说有点奇怪。能解释一下原因吗?

最佳答案

这是您不应该关心的实现细节。您看到 FFFEFFFF 是因为您在 64 位操作系统上运行并且您的 EXE 项目的平台目标设置为 AnyCPU 并且勾选了“首选 32 位”选项。 .NET 项目的默认设置。 AnyCPU 选项获取可执行文件头集中的/LARGEADDRESSAWARE 选项位,告诉操作系统在 64 位操作系统上提供 4 GB 的地址空间。在 32 位操作系统上,您将始终获得 7FFEFFFF。

将平台目标设置为 x86 以查看差异。项目 > 属性 > 构建选项卡。

如果您希望调试版本产生相同的值,则需要使用“项目”>“属性”>“调试”> 取消选中“启用 Visual Studio 托管进程”选项。托管进程是另一个 EXE,yourproject.vshost.exe。它没有设置选项位可以说是一个错误。但很可能是解决棘手问题的便捷捷径。

您可以使用 Dumpbin.exe/headers 查看两者之间的区别。报告为“应用程序可以处理大 (>2GB) 地址”。

关于c# - GetSystemInfo() 为最大应用程序地址返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39474538/

相关文章:

c# - 将两个 LINQ 语句合并为一个

c# - 如何在 C# 中读取二进制文件?

c++ - 从程序集调用 Win32 的 Sleep 函数会产生访问冲突错误

c++ - 如何将 Golang 编写的应用程序作为 Windows 服务运行

c++ - 使用 WinAPI 找出锁定文件的内容

c# - 如何从控制台读取多行用户输入?

c# - 如何根据具有相同哈希码的对象获取字典项?

c# - 如何将矢量格式的图形从一个线程返回到另一个线程?

c++ - RegOpenKeyEx 给出错误 2 或错误 161,两种方式均失败

c++ - Win32 窗口文本问题