À 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?
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.
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:
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.
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.
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é.
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.
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.
obj
contient- 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 dansbin
.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:
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é.
la source
Le
obj
ré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. Lebin
ré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.
la source
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.
la source
Soyez prudent avec les
setup
projets si vous les utilisez; Les projets d'installation de Visual Studio sontPrimary Output
extraits duobj
dossier plutôt que dubin
.Je publiais des applications que je pensais être obscurcies et connectées dans les
msi
configurations 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 lesbin
assemblys de dossiers et aurait dû cibler leobj
dossier assemblées à la place.C'est loin d'être intuitif à mon humble avis, mais l'
setup
approche générale est d'utiliserPrimary Output
le projet et c'est leobj
dossier. J'adorerais que quelqu'un puisse faire la lumière sur ce btw.la source