我想在C#中调用Windows {GetSystemInfo()
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());
当我运行此程序时,通过调试器(使用“开始”按钮),它显示:
Min Address: 10000
Max Address: 7FFEFFFF
但是当我构建它并运行可执行文件时,它会显示:
Min Address: 10000
Max Address: FFFEFFFF
Max Addresses之间的区别对我来说有点奇怪。你能解释一下原因吗?
答案 0 :(得分:4)
这是 与您无关的实施细节。您看到FFFEFFFF是因为您在64位操作系统上运行,并且您的EXE项目的平台目标设置为AnyCPU并且"首选32位"选项已勾选。 .NET项目的默认设置。 AnyCPU选项获取可执行文件头集中的/ LARGEADDRESSAWARE选项位,告诉操作系统在64位操作系统上提供4 GB的地址空间。你总是在32位操作系统上获得7FFEFFFF。
将平台目标设置为x86以查看差异。项目>属性>构建选项卡。
如果您希望Debug构建生成相同的值,则需要使用Project>属性>调试>取消"启用Visual Studio托管过程"选项。托管过程是另一个EXE,yourproject.vshost.exe。它没有设置选项位,可以说是一个错误。但很可能是一个棘手问题的便捷捷径。
您可以通过Dumpbin.exe /标头查看两者之间的区别。报告为"应用程序可以处理大型(> 2GB)地址"。
答案 1 :(得分:0)
要检查应用程序的地址空间,最好使用VirtualQuery
或VirtualQueryEx
Windows API函数,而不是逐页扫描内存(或64KB区域除64KB区域)。 Ex变体允许您检查与您的进程不同的进程的地址空间。
您的原始问题已在上述评论中得到解答。