Para que são usadas as pastas obj e bin (criadas pelo Visual Studio)?

222

Criei um novo projeto no Visual Studio 2010 e notei que agora existem duas novas pastas nomeadas obje binno diretório do meu projeto.

Um par semelhante de pastas é criado ao criar e depurar - para que servem essas pastas?

yesraaj
fonte

Respostas:

238

A objpasta contém arquivos objeto, ou intermediários, que são arquivos binários compilados que ainda não foram vinculados. São essencialmente fragmentos que serão combinados para produzir o executável final. O compilador gera um arquivo de objeto para cada arquivo de origem e esses arquivos são colocados na objpasta.

A binpasta contém arquivos binários , que são o código executável real do seu aplicativo ou biblioteca.

Cada uma dessas pastas é subdividida em pastas Debuge Release, que simplesmente correspondem às configurações de compilação do projeto. Os dois tipos de arquivos discutidos acima são colocados na pasta apropriada, dependendo do tipo de construção que você executa. Isso facilita a determinação de quais executáveis ​​são criados com símbolos de depuração e quais foram criados com otimizações ativadas e prontas para lançamento.

Observe que você pode alterar onde o Visual Studio gera seus arquivos executáveis ​​durante uma compilação nas propriedades do seu projeto. Você também pode alterar os nomes e as opções selecionadas para suas configurações de construção.

Cody Gray
fonte
4
Por qualquer motivo, meu projeto não possui uma subpasta de depuração ou liberação para as pastas obj e bin. Se eu editar as configurações do meu projeto para criar a subpasta debug / release, dependendo da configuração selecionada no momento, recebo um erro de que o tipo de dados não pôde ser criado quando depuro meu aplicativo. Meu aplicativo apenas procura as DLLs na pasta bin e nunca sabe procurar na pasta de depuração ou liberação. Como faço para corrigir isso?
Anil Natha
3
@Sly Eu não entendo o que você está perguntando. Um projeto cria um aplicativo (EXE) ou uma biblioteca (DLL). Não pode construir ambos. Portanto, se o seu projeto criar um aplicativo, ele não colocará nenhuma DLL na sua pasta bin. E se o seu projeto criar uma biblioteca, você receberá um erro ao tentar depurá-lo porque não pode executar uma DLL. De qualquer forma, parece que você alterou o caminho de saída padrão nas propriedades do seu projeto. Se precisar de mais ajuda, faça uma nova pergunta. Documente bem o problema, incluindo capturas de tela da configuração do seu projeto, se necessário.
Cody Gray
2
Gostaria de saber se posso forçar o visual studio excluir a pasta obj após a compilação é obrigatória?
Johnny_D
2
@SlyRaskal Uma razão pela qual você pode não ter pastas Debug / Release é se estiver desenvolvendo um projeto da web?
Tim Iles
2
Será que objrealmente só contêm unlinked arquivos de código-objeto? Da minha experiência, ele contém todos eles, e na etapa de compilação final, os arquivos que fazem parte do "jogo final" são copiados para bin.
ivan_pozdeev
44

Gostaria de encorajá-lo a ver este vídeo do youtube que demonstra a diferença entre as pastas bin C # e obj e também explica como obtemos o benefício da compilação incremental / condicional.

A compilação de C # é um processo de duas etapas, consulte o diagrama abaixo para obter mais detalhes:

  1. Compilando: Na fase de compilação, arquivos de código C # individuais são compilados em unidades compiladas individuais. Esses arquivos de código compilado individuais vão no diretório OBJ.
  2. Vinculação: na fase de vinculação, esses arquivos de código compilados individuais são vinculados para criar DLL e EXE de unidade única. Isso vai no diretório BIN.

C # bin vs pastas de objetos

Se você comparar os diretórios bin e obj, encontrará um número maior de arquivos no diretório "obj", pois ele possui arquivos de código compilados individuais, enquanto "bin" possui uma única unidade.

bin vs obj

Shivprasad Koirala
fonte
20

O objdiretório é para arquivos de objetos intermediários e outros arquivos de dados transitórios que são gerados pelo compilador ou pelo sistema de compilação durante uma compilação. obin diretório é o diretório no qual os binários de saída final (e quaisquer dependências ou outros arquivos implementáveis) serão gravados.

Você pode alterar os diretórios reais usados ​​para os dois propósitos nas configurações do projeto, se desejar.

David Ferenczy Rogožan
fonte
"bin" pode ser alterado nas propriedades do projeto -> "Build" -> "Output" -> "Output path". Mas e quanto a "obj"?
Peter Mortensen
5

Um fato interessante sobre o diretório obj: se você tiver a publicação configurada em um projeto da web, os arquivos que serão publicados serão preparados para obj \ Release \ Package \ PackageTmp. Se você deseja publicar os arquivos você mesmo, em vez de usar o recurso VS integrado, você pode pegar os arquivos que realmente precisa implantar aqui, em vez de selecionar todos os detritos digitais no diretório bin.

Roger Hill
fonte
0

Tenha cuidado com os setupprojetos se estiver usando-os; Os projetos de instalação do Visual Studio são Primary Outputextraídos da objpasta e não dobin .

Eu estava liberando aplicativos que pensei que estavam ocultos e com msiconfigurações iniciadas por um bom tempo antes de descobrir que os arquivos de aplicativos implantados não eram ocultados nem assinados, enquanto eu realizava o procedimento pós-compilação nos binassemblies de pastas e deveria ter como alvo a objpasta assemblies.

Isso está longe de ser intuitivo, mas a setupabordagem geral é usar o Primary Outputdo projeto e essa é a objpasta. Eu adoraria se alguém pudesse lançar alguma luz sobre este btw.

SteveCinq
fonte