2016-01-20 9 views
5

Ho riscontrato questo problema durante il test delle prestazioni.Compilazione di C# con qualsiasi set di CPU L'applicazione può gestire indirizzi grandi (> 2 GB)

Quando si compila un'applicazione C# Console con la bandiera piattaforma x86, la bandiera Consapevole Large Address non è impostato:

uscita da dumpbin/intestazioni 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 

Quando si imposta la bandiera per "Qualsiasi CPU" l'exe risultante è 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 

si noti che la "Applicazione in grado di gestire grandi dimensioni (> 2 GB) indirizzi" flag è impostato.

Non riesco a trovare alcuna documentazione su questo argomento. Tutte le altre domande di overflow dello stack suggeriscono è necessario farlo manualmente:

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

La domanda è: Dove si trova questa documentata?

+0

No dove afaik. È risolvibile, strano che tu non sia interessato alle soluzioni. –

+0

@HansPassant, non è necessariamente un problema (per noi), solo molto inaspettato. E il fatto che non sia documentato lo rende un dolore. –

+0

La cosa più vicina che riesco a trovare nella documentazione da una fonte primaria è questo post del blog, http://blogs.msdn.com/b/calvin_hsia/archive/2010/09/27/10068359.aspx. – JamieSee

risposta

2

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. L'unico modo per fare ciò è contrassegnare il file binario come grande indirizzo informato quando si mira a AnyCPU. Inoltre, se questo non fosse il caso, non sarebbe stato opportuno impostare Prefer 32-bit come predefinito.

Dove è documentato?

Questo non è stato esplicitamente documentato, è implicito.

Tutte le altre domande di overflow dello stack suggeriscono è necessario farlo manualmente

Indipendentemente da tutte queste domande e risposte, questo è richiesto solo quando il targeting x86.

+2

Fare Prefer 32-bit l'impostazione predefinita è stata eseguita in VS2012. Rendendolo impostato anche il flag LARGE ADDRESS AWARE è solo a partire da VS2015. –

Problemi correlati