Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
651 views
in Technique[技术] by (71.8m points)

visual studio - Compiling C# with Any CPU sets Application can handle large (>2GB) addresses

I ran into this issue during performance testing.

When compiling a C# Console application with the x86 platform flag, the Large Address Aware flag is not set:

Output from 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

When setting the flag to "Any Cpu" the resulting exe is Large Address Aware:

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

Notice that the "Application can handle large (>2GB) addresses" flag is set.

I cannot find any documentation on this subject. All other stack overflow questions suggest you must do this manually:

How to enable IMAGE_FILE_LARGE_ADDRESS_AWARE in C# source code?

Can I set LARGEADDRESSAWARE from within Visual Studio?

Use the 3Gb of memory in 32 bits applications

The question is: Where is this documented?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The purpose of AnyCPU is to be able to run managed code on both x86 and x64 platforms while at the same time take advantage of the larger address space of x64 platforms. The only way to do this is to mark the binary as large address aware when targeting AnyCPU. In addition, if this was not the case, it would have not been appropriate to make Prefer 32-bit the default.

Where is this documented?

This has not been explicitly documented, it's implied.

All other stack overflow questions suggest you must do this manually

Irrespective of all of those questions and answers, this is required only when targeting x86.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...