À quoi servent les dossiers obj et bin (créés par Visual Studio)?


222

J'ai créé un nouveau projet dans Visual Studio 2010 et j'ai remarqué qu'il y a maintenant deux nouveaux dossiers nommés objet bindans mon répertoire de projet.

Une paire de dossiers similaire est créée lors de la création et du débogage - à quoi servent ces dossiers?

Réponses:


238

Le objdossier contient des fichiers objets ou intermédiaires, qui sont des fichiers binaires compilés qui n'ont pas encore été liés. Ce sont essentiellement des fragments qui seront combinés pour produire l'exécutable final. Le compilateur génère un fichier objet pour chaque fichier source et ces fichiers sont placés dans le objdossier.

Le bindossier contient des fichiers binaires , qui sont le code exécutable réel de votre application ou bibliothèque.

Chacun de ces dossiers est subdivisé en Debuget Releasedossiers, qui correspondent simplement aux configurations de construction du projet. Les deux types de fichiers décrits ci-dessus sont placés dans le dossier approprié, selon le type de génération que vous effectuez. Cela vous permet de déterminer facilement quels exécutables sont construits avec des symboles de débogage et lesquels ont été construits avec des optimisations activées et prêtes à être publiées.

Notez que vous pouvez changer où Visual Studio sort vos fichiers exécutables lors d'une compilation dans les propriétés de votre projet. Vous pouvez également modifier les noms et les options sélectionnées pour vos configurations de build.


4
Pour une raison quelconque, mon projet n'a pas de sous-dossier de débogage ou de publication pour les dossiers obj et bin. Si je modifie mes paramètres de projet pour les construire dans le sous-dossier debug / release en fonction de la configuration actuellement sélectionnée, je reçois une erreur indiquant que le type de données n'a pas pu être créé lorsque je débogue mon application. Mon application ne recherche que les DLL dans le dossier bin et ne sait jamais chercher dans le dossier de débogage ou de publication. Comment puis-je corriger cela?
Anil Natha

3
@Sly, je ne comprends pas ce que vous demandez. Un projet crée une application (EXE) ou une bibliothèque (DLL). Il ne peut pas construire les deux. Donc, si votre projet crée une application, il ne placera aucune DLL dans votre dossier bin. Et si votre projet crée une bibliothèque, vous obtiendrez une erreur lorsque vous essayez de la déboguer car vous ne pouvez pas exécuter une DLL. Quoi qu'il en soit, il semble que vous ayez modifié le chemin de sortie par défaut dans les propriétés de votre projet. Si vous avez besoin de plus d'aide, posez une nouvelle question. Assurez-vous de bien documenter le problème, y compris des captures d'écran de la configuration de votre projet si nécessaire.
Cody Gray

2
Je me demande si je peux forcer Visual Studio à supprimer le dossier obj une fois la construction terminée.
Johnny_D

2
@SlyRaskal Une des raisons pour lesquelles vous n'avez peut-être pas de dossiers de débogage / version est si vous développez un projet Web?
Tim Iles du

2
Ne objcontient- il vraiment que des fichiers de code objet non liés ? D'après mon expérience, il contient tous d'entre eux, et à l'étape de construction finale, les fichiers qui font partie de la « dernière série » sont copiés dans bin.
ivan_pozdeev

44

Je vous encourage à voir cette vidéo youtube qui montre la différence entre les dossiers C # bin et obj et explique également comment nous bénéficions de la compilation incrémentielle / conditionnelle.

La compilation C # est un processus en deux étapes, voir le diagramme ci-dessous pour plus de détails:

  1. Compilation: Pendant la phase de compilation, les fichiers de code C # individuels sont compilés en unités compilées individuelles. Ces fichiers de code compilés individuels vont dans le répertoire OBJ.
  2. Liaison: dans la phase de liaison, ces fichiers de code compilés individuels sont liés pour créer des DLL et EXE à unité unique. Cela va dans le répertoire BIN.

Dossiers C # bin vs obj

Si vous comparez les répertoires bin et obj, vous trouverez un plus grand nombre de fichiers dans le répertoire "obj" car il contient des fichiers de code compilés individuels tandis que "bin" a une seule unité.

bin vs obj


20

Le objrépertoire est destiné aux fichiers objets intermédiaires et autres fichiers de données transitoires générés par le compilateur ou le système de génération lors d'une génération. Le binrépertoire est le répertoire dans lequel les binaires de sortie finale (et toutes les dépendances ou autres fichiers déployables) seront écrits.

Vous pouvez modifier les répertoires réels utilisés à ces deux fins dans les paramètres du projet, si vous le souhaitez.


"bin" peut être modifié dans les propriétés du projet -> "Build" -> "Output" -> "Output path". Mais qu'en est-il de "obj"?
Peter Mortensen

5

Un fait intéressant à propos du répertoire obj: si vous avez configuré la publication dans un projet Web, les fichiers qui seront publiés sont placés dans obj \ Release \ Package \ PackageTmp. Si vous souhaitez publier les fichiers vous-même plutôt que d'utiliser la fonction VS intégrée, vous pouvez récupérer les fichiers que vous devez réellement déployer ici, plutôt que de parcourir tous les débris numériques dans le répertoire bin.


0

Soyez prudent avec les setupprojets si vous les utilisez; Les projets d'installation de Visual Studio sont Primary Outputextraits du objdossier plutôt que du bin.

Je publiais des applications que je pensais être obscurcies et connectées dans les msiconfigurations pendant un certain temps avant de découvrir que les fichiers d'application déployés n'étaient en fait ni obscurcis ni signés car j'exécutais la procédure de post-génération sur les binassemblys de dossiers et aurait dû cibler le objdossier assemblées à la place.

C'est loin d'être intuitif à mon humble avis, mais l' setupapproche générale est d'utiliser Primary Outputle projet et c'est le objdossier. J'adorerais que quelqu'un puisse faire la lumière sur ce btw.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.