我想GetSystemInfo()在 C# 中调用 Windows 的API 函数,以便检索maximumApplicationAddress和minimumApplicationAddress扫描计算机的内存。
我写了一个简单的程序来输出这些值:
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());
Run Code Online (Sandbox Code Playgroud)
当我通过调试器(使用“开始”按钮)运行此程序时,它显示:
Min Address: 10000
Max Address: 7FFEFFFF
Run Code Online (Sandbox Code Playgroud)
但是当我构建它并运行可执行文件时,它显示:
Min Address: 10000
Max Address: FFFEFFFF
Run Code Online (Sandbox Code Playgroud)
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) 地址”。
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |