Tenho alguma confusão relacionada às opções de compilação da plataforma .NET no Visual Studio 2008.
Qual é o destino de compilação "Qualquer CPU" e que tipo de arquivo ele gera? Examinei o executável de saída dessa compilação "Any CPU" e descobri que eles são os executáveis x86 (que não esperariam isso!). Portanto, existe alguma diferença entre direcionar executável para x86 x "Qualquer CPU"?
Outra coisa que notei é que os projetos C ++ gerenciados não têm essa plataforma como opção. Por que é que? Isso significa que minha suspeita sobre os executáveis de "Qualquer CPU" serem simples de 32 bits está correta?
.net
visual-studio-2008
build
64-bit
galets
fonte
fonte
Any CPU
e você estiver executando em um sistema operacional de 64 bits, você perde a capacidade de editar e continuar durante a depuração. (Você está efetivamente depurando um processo de 64 bits). Você pode fazer o destino do projeto de inicializaçãox86
contornar isso durante a depuração. (Os conjuntos referenciados a partir do projecto de arranque pode continuar a alvoAny CPU
.x86
biblioteca sendo consumida por umAnyCPU
aplicativo onde eu tinha que definirPrefer 32-bit
para evitar um erro de carregamento.Respostas:
Um assembly AnyCPU JIT para código de 64 bits quando carregado em um processo de 64 bits e 32 bits quando carregado em um processo de 32 bits.
Ao limitar a CPU, você diria: Há algo sendo usado pelo assembly (algo provavelmente não gerenciado) que requer 32 bits ou 64 bits.
fonte
Acho que a maioria das coisas importantes foi mencionada, mas pensei em acrescentar uma coisa: se você compilar como Qualquer CPU e executar em uma plataforma x64, não poderá carregar arquivos DLL de 32 bits, porque seu aplicativo não foi iniciado no WoW64 , mas esses arquivos DLL precisam ser executados lá.
Se você compilar como x86, o sistema x64 executará seu aplicativo no WoW64 e poderá carregar arquivos DLL de 32 bits.
Portanto, acho que você deve escolher "Qualquer CPU" se suas dependências puderem ser executadas em qualquer ambiente, mas escolher x86 se tiver dependências de 32 bits. Este artigo da Microsoft explica isso um pouco:
/ CLRIMAGETYPE (especifique o tipo de imagem CLR)
Aliás, esta outra documentação da Microsoft concorda que o x86 é geralmente uma opção mais portátil:
fonte
Aqui está uma rápida visão geral que explica os diferentes destinos de criação.
Pela minha própria experiência, se você deseja criar um projeto que será executado nas plataformas x86 e x64 e não possui otimizações específicas para x64, eu alteraria a construção para dizer especificamente "x86".
Às vezes, a razão para isso é que você pode obter alguns arquivos DLL que colidem ou algum código que acaba causando o travamento do WoW no ambiente x64. Especificando especificamente x86, o sistema operacional x64 tratará o aplicativo como um aplicativo x86 puro e garantirá que tudo corra bem.
fonte
Confira o artigo Visual Studio .NET Platform Target Explained .
O link acima foi relatado como quebrado, então aqui está outro artigo com uma explicação semelhante: O que AnyCPU realmente significa no .NET 4.5 e no Visual Studio 11
fonte
Crédito para o livro "CLR via C #" , consulte o seguinte:
fonte
"Qualquer CPU" significa que, quando o programa for iniciado, o .NET Framework determinará, com base no sistema operacional, se o seu programa deve ser executado em 32 ou 64 bits.
Há uma diferença entre x86 e Qualquer CPU : em um sistema x64, o executável compilado para o X86 será executado como um executável de 32 bits.
No que diz respeito às suas suspeitas, vá para a linha de comando do Visual Studio 2008 e execute o seguinte.
Ele lhe dirá o testemunho do seu programa, e muito mais.
fonte
Qualquer CPU significa que funcionará em qualquer plataforma. Isso ocorre porque o código gerenciado é semelhante ao Java. Pense nisso como sendo compilado em um código de bytes que é interpretado pelo .NET Framework em tempo de execução.
O C ++ não possui essa opção porque é compilado para um código de máquina específico da plataforma.
fonte
Eu recomendo a leitura deste post .
Ao usar o AnyCPU , a semântica é a seguinte:
fonte