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?



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.


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.


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 ).


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.