使用 Any CPU 编译 C# 代码可以使应用程序处理大于 2GB 的内存地址。

7
我在性能测试期间遇到了这个问题。
当使用x86平台标志编译C#控制台应用程序时,未设置Large Address Aware标志:
来自dumpbin /headers app.exe的输出:
Dump of file app.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               3 number of sections
        569F0089 time date stamp Tue Jan 19 21:35:37 2016
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine

当将标志设置为“任何 CPU”时,生成的 exe 文件是大地址感知的:

Dump of file app.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               3 number of sections
        569F01D7 time date stamp Tue Jan 19 21:41:11 2016
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
              22 characteristics
                   Executable
                   Application can handle large (>2GB) addresses

请注意,"应用程序可以处理大于2GB的地址"标志已设置。
我找不到关于这个主题的任何文档。所有其他堆栈溢出问题都建议您必须手动执行此操作: 如何在C#源代码中启用IMAGE_FILE_LARGE_ADDRESS_AWARE? 我可以从Visual Studio中设置LARGEADDRESSAWARE吗? 在32位应用程序中使用3Gb内存 问题是:这在哪里有记录?

没有我所知道的地方。这是可以解决的,奇怪的是你不感兴趣解决方案。 - Hans Passant
@HansPassant,这不一定是我们的问题,只是非常出乎意料。而且它没有文档说明,这让人很痛苦。 - Chris Weber
我能找到的最接近主要来源的文档是这篇博客文章,http://blogs.msdn.com/b/calvin_hsia/archive/2010/09/27/10068359.aspx。 - JamieSee
FYI,Visual Studio 2013没有这个功能,这是在2015年新增的。 - Seb Wills
1个回答

4
AnyCPU的目的是能够在x86和x64平台上运行托管代码,同时利用x64平台更大的地址空间。 要做到这一点,必须在针对AnyCPU时将二进制文件标记为large address aware。此外,如果不是这样的话,将Prefer 32-bit设为默认值也是不合适的。

这个在哪里有详细说明?

这并没有明确说明,但可以暗示。

其他所有的Stack Overflow问题都表明你必须手动进行此操作

无论其他问题和答案是什么,只有当针对x86平台时才需要执行此操作。


2
将 Prefer 32-bit 设置为默认是在 VS2012 中完成的。而在 VS2015 中,设置 LARGE ADDRESS AWARE 标志也是如此。 - Seb Wills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接