Qual é o objetivo da configuração "Preferir 32 bits" no Visual Studio e como ela realmente funciona?

204

Digite a descrição da imagem aqui

Não está claro para mim como o compilador saberá automaticamente compilar para 64 bits quando necessário. Como ele sabe quando pode direcionar com segurança 32 bits?

Estou principalmente curioso sobre como o compilador sabe qual arquitetura segmentar ao compilar. Ele analisa o código e toma uma decisão com base no que encontra?

Aaron
fonte
Ah obrigada. Não vi isso antes. Ainda estou curioso para saber como o compilador sabe automaticamente qual arquitetura direcionar. Alguma ideia?
Aaron

Respostas:

219

A Microsoft tem uma entrada de blog O que AnyCPU realmente significa no .NET 4.5 e no Visual Studio 11 :

No .NET 4.5 e no Visual Studio 11, o queijo foi movido. O padrão para a maioria dos projetos .NET é novamente AnyCPU, mas há mais de um significado para AnyCPU agora. Existe um subtipo adicional de AnyCPU, "Qualquer CPU de 32 bits preferida", que é o novo padrão (no geral, agora existem cinco opções para a opção de compilador C # da plataforma: x86, Itanium, x64, anycpu e anycpu32bitpreferred ) Ao usar o sabor "Prefer 32-Bit" do AnyCPU, a semântica é a seguinte:

  • Se o processo for executado em um sistema Windows de 32 bits, será executado como um processo de 32 bits. A IL é compilada no código de máquina x86.
  • Se o processo for executado em um sistema Windows de 64 bits, será executado como um processo de 32 bits. A IL é compilada no código de máquina x86.
  • Se o processo for executado em um sistema Windows ARM, ele será executado como um processo de 32 bits. A IL é compilada no código de máquina do ARM.

A diferença, então, entre “Qualquer CPU preferida de 32 bits” e “x86” é apenas esta: um aplicativo .NET compilado para x86 falhará ao ser executado em um sistema ARM Windows, mas um aplicativo “Qualquer CPU preferida de 32 bits” será executado com sucesso.

Lex Li
fonte
12
+1. Além disso, a caixa de seleção "Preferir 32 bits" está habilitada apenas para projetos executáveis ​​do .NET 4.5+.
Lee Grissom
12
Outra vantagem de anycpu32bitspreferred é que outro .exe executando em 64 bits pode carregar esse assembly.
de Bruno Martinez
30
Pessoalmente, acho horrível que eles definam isso por padrão, sem nenhuma configuração de Ferramentas para desativá-lo. Pior ainda, você não pode procurá-lo, pois não está nos arquivos csproj, a menos que esteja desativado! Provavelmente adicionado devido às incompatibilidades da automação do Office com o CPUAny em uma máquina x64 com a maioria das pessoas instalando o Office de 32 bits.
Dave
6
@BrianDavidBerman, se você definir falso como 32, mas preferir e definir x64 ou Qualquer CPU em uma máquina de 64 bits.
Lex Li
6
A diferença entre x86 e Qualquer CPU de 32 bits preferida é que, neste último caso, o sinalizador wideeaddressaware seja definido no executável. Isso significa que o processo de 32 bits em execução em um sistema operacional de 64 bits pode usar 2 GB de memória no modo x86 e 4 GB de memória no modo preferido de qualquer CPU de 32 bits.
Nic
6

Aqui está uma resposta simples:

Arco de aplicação.

Nota: AnyCPU-32bitPreferred está disponível apenas no .Net versão 4.5 e superior.

Yousha Aleayoub
fonte
2
Qual é a diferença entre "roda em 32 bits" e roda em "WoW64". Pensei em WoW64 = "Windows (32 bits) no Windows64" e era necessário para a execução de qualquer aplicativo de 32 bits.
Peter Cordes
Existe uma fonte para isso? Aparentemente, em qualquer outro lugar ainda me diz que o padrão é anycpu32bitpreferred, o que é uma grande diferença para as pessoas que executam em máquinas Windows de 64 bits (isso é muito).
precisa
@RanSagy, você pode simplesmente testá-lo criando um novo projeto e verificando Project -> Properties -> Build tab -> Platform target... mas observe que ele AnyCPU-32bitPreferredestá disponível apenas no .Net versão 4.5 e superior. É por isso que o padrão é AnyCPU.
Yousha Aleayoub
Em alguns casos, o meu estava acinzentado; Eu só estava esperando há alguma documentação sobre o que acontece no .net 4.5+ ou .net / core padrão (ou realmente, MSBuild 16)
Ran Sagy
-1

O motivo é: caso você não queira usar mais memória com aplicativos de 64 bits. O que significa que, se seu aplicativo for AnyCPU , você deseja executar como 32 bits.

Para adicionar mais, a configuração no Visual Studio tem como alvo o CLR específico:

O Visual Studio instala a versão de 32 bits do CLR em um computador x86 e a versão de 32 bits e a versão de 64 bits apropriada do CLR em um computador com Windows de 64 bits. (Como o Visual Studio é um aplicativo de 32 bits, quando é instalado em um sistema de 64 bits, é executado no WOW64.)

Por favor, consulte o artigo Aplicativos de 64 bits ( MSDN ).

Peru
fonte
1
Não tenho certeza se isso é exato. Entendo que os executáveis ​​do .NET, independentemente de 32 ou 64, ainda estejam limitados a cerca de 2 GB por processo.
JP Richardson
1
Editou minha resposta. Mas não tenho certeza se é isso que você está procurando :)
Peru
2
@ Aaron, o compilador essencialmente define o sinalizador para o tempo de execução para decidir se está correto carregar a montagem (ou seja, a montagem apenas do bloco x86 a ser carregada no processo x64) e como iniciar o processo (para o novo EXE) com base nas sinalizações. Eu acredito que IL é a mesma para os dois sabores.
Alexei Levenkov 22/08/2012
1
@JPRichardson Sim, você está certo. Mas no .net 4.5 você tem a opção de aumentar o tamanho. consulte MSDN
Peru
40
@JPRichardson, executável .Net de 32 e 64 bits, limitado a 2 GB por processo - antes de tudo, o espaço de endereço por processo é a restrição de nível do SO (2/3 + GB para o processo de 32 bits e muito mais para 64 bits), a segunda versão de 32 bits pode use mais de 2 GB se o sinalizador "LargeAddressAware" estiver definido no executável. As únicas restrições de 2 GB que conheço são sobre tamanhos de matriz / alocação limitados pelo intervalo Int32 (cerca de 2 GB).
Alexei Levenkov 22/08/2012