Компиляция C# с любыми наборами ЦП Приложение может обрабатывать большие (>2 ГБ) адреса
Я столкнулся с этой проблемой во время тестирования производительности.
При компиляции консольного приложения C# с флагом платформы x86 флаг 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
При установке флажка "Any Cpu", в результате исполняемый файл является 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
Обратите внимание, что установлен флаг "Приложение может обрабатывать большие (>2 ГБ) адреса".
Я не могу найти какую-либо документацию по этому вопросу. Все остальные вопросы о переполнении стека предполагают, что вы должны сделать это вручную:
Как включить IMAGE_FILE_LARGE_ADDRESS_AWARE в исходном коде C#?
Могу ли я установить LARGEADDRESSAWARE из Visual Studio?
Используйте 3Gb памяти в 32-битных приложениях
Вопрос: где это задокументировано?
1 ответ
Цель AnyCPU - запускать управляемый код на платформах x86 и x64, одновременно используя преимущества большего адресного пространства платформ x64. Единственный способ сделать это состоит в том, чтобы пометить двоичный файл как большой адрес, осведомленный при нацеливании на AnyCPU. Кроме того, если бы это было не так, было бы неуместно устанавливать Prefer 32-bit по умолчанию.
Где это задокументировано?
Это не было явно задокументировано, это подразумевается.
Все остальные вопросы переполнения стека предполагают, что вы должны сделать это вручную
Независимо от всех этих вопросов и ответов, это требуется только при таргетинге на x86.