¿Para qué se usan las carpetas obj y bin (creadas por Visual Studio)?

222

Creé un nuevo proyecto en Visual Studio 2010 y noté que ahora hay dos nuevas carpetas con nombre objy binen mi directorio de proyecto.

Al crear y depurar se crea un par similar de carpetas: ¿para qué sirven estas carpetas?

yesraaj
fuente

Respuestas:

238

La objcarpeta contiene archivos de objetos, o intermedios, que son archivos binarios compilados que aún no se han vinculado. Son esencialmente fragmentos que se combinarán para producir el ejecutable final. El compilador genera un archivo de objeto para cada archivo fuente, y esos archivos se colocan en la objcarpeta.

La bincarpeta contiene archivos binarios , que son el código ejecutable real para su aplicación o biblioteca.

Cada una de estas carpetas se subdividen en Debugy Releasecarpetas, que simplemente se corresponden con configuraciones de construcción del proyecto. Los dos tipos de archivos descritos anteriormente se colocan en la carpeta correspondiente, según el tipo de compilación que realice. Esto le facilita determinar qué ejecutables se crean con símbolos de depuración y cuáles se crearon con optimizaciones habilitadas y listas para su lanzamiento.

Tenga en cuenta que puede cambiar dónde Visual Studio genera sus archivos ejecutables durante una compilación en las Propiedades de su proyecto. También puede cambiar los nombres y las opciones seleccionadas para sus configuraciones de compilación.

Cody Gray
fuente
44
Por alguna razón, mi proyecto no tiene una subcarpeta de depuración o liberación para las carpetas obj y bin. Si edito la configuración de mi proyecto para compilar en la subcarpeta de depuración / liberación, dependiendo de la configuración seleccionada actualmente, recibo un error de que el tipo de datos no se pudo crear cuando depuro mi aplicación. Mi aplicación solo busca en la carpeta bin los dlls y nunca sabe buscar en la carpeta de depuración o liberación. ¿Cómo corrijo esto?
Anil Natha
3
@Sly No entiendo lo que estás preguntando. Un proyecto crea una aplicación (EXE) o una biblioteca (DLL). No puede construir ambos. Entonces, si su proyecto crea una aplicación, no colocará ninguna DLL en su carpeta bin. Y si su proyecto construye una biblioteca, recibirá un error cuando intente depurarlo porque no puede ejecutar una DLL. De todos modos, parece que ha cambiado la ruta de salida predeterminada en las propiedades de su proyecto. Si necesita más ayuda, haga una nueva pregunta. Asegúrese de documentar bien el problema, incluidas capturas de pantalla de la configuración de su proyecto si es necesario.
Cody Gray
2
Me pregunto si puedo forzar a Visual Studio a eliminar la carpeta obj después de que se compila la compilación.
Johnny_D
2
@SlyRaskal Una de las razones por las que puede que no tenga las carpetas Debug / Release es si está desarrollando un proyecto web.
Tim Iles
2
¿ objRealmente solo contiene archivos de código de objeto no vinculados ? Desde mi experiencia, que contiene todos los de ellos, y en la etapa de desarrollo final, los archivos que forman parte del "conjunto final" se copian en bin.
ivan_pozdeev
44

Le animo a que vea este video de YouTube que demuestra la diferencia entre las carpetas C # bin y obj y también explica cómo obtenemos el beneficio de la compilación incremental / condicional.

La compilación de C # es un proceso de dos pasos, consulte el siguiente diagrama para obtener más detalles:

  1. Compilación: en la fase de compilación, los archivos de código C # individuales se compilan en unidades compiladas individuales. Estos archivos de código compilados individuales van en el directorio OBJ.
  2. Vinculación: en la fase de vinculación, estos archivos de código compilados individuales se vinculan para crear una sola unidad DLL y EXE. Esto va en el directorio BIN.

Carpetas C # bin vs obj

Si compara los directorios bin y obj, encontrará una mayor cantidad de archivos en el directorio "obj", ya que tiene archivos de código compilados individuales, mientras que "bin" tiene una sola unidad.

bin vs obj

Shivprasad Koirala
fuente
20

El objdirectorio es para archivos de objetos intermedios y otros archivos de datos transitorios generados por el compilador o el sistema de compilación durante una compilación. El bindirectorio es el directorio en el que se escribirán los binarios de salida final (y cualquier dependencia u otros archivos desplegables).

Puede cambiar los directorios reales utilizados para ambos fines dentro de la configuración del proyecto, si lo desea.

David Ferenczy Rogožan
fuente
"bin" se puede cambiar en las propiedades del proyecto -> "Compilar" -> "Salida" -> "Ruta de salida". ¿Pero qué hay de "obj"?
Peter Mortensen
5

Un hecho interesante sobre el directorio obj: si ha configurado la publicación en un proyecto web, los archivos que se publicarán se organizarán en obj \ Release \ Package \ PackageTmp. Si desea publicar los archivos usted mismo en lugar de utilizar la función VS integrada, puede tomar los archivos que realmente necesita implementar aquí, en lugar de seleccionar todos los desechos digitales en el directorio bin.

Roger Hill
fuente
0

Tenga cuidado con los setupproyectos si los está usando; Los proyectos de instalación de Visual Studio se Primary Outputextraen de la objcarpeta en lugar de bin.

Estuve lanzando aplicaciones que pensé que estaban ofuscadas y las msiconfiguraciones iniciadas durante bastante tiempo antes de descubrir que los archivos de la aplicación implementada en realidad no estaban ofuscados ni firmados mientras realizaba el procedimiento posterior a la compilación en los binensamblajes de carpetas y deberían haber apuntado a la objcarpeta asambleas en su lugar.

Esto está lejos de ser intuitivo, pero el setupenfoque general es usar el Primary Outputdel proyecto y esta es la objcarpeta. Me encantaría que alguien pudiera arrojar algo de luz sobre esto por cierto.

SteveCinq
fuente