Для чего используются папки obj и bin (созданные Visual Studio)?

222

Я создал новый проект в Visual Studio 2010 и заметил, что теперь есть две новые папки с именем objи binв моем каталоге проектов.

Подобная пара папок создается при сборке и отладке - для чего эти папки?

yesraaj
источник

Ответы:

238

objПапка имеет объект, или промежуточный, файлы , которые компилируются двоичные файлы, которые не были связаны еще. По сути, это фрагменты, которые будут объединены для создания окончательного исполняемого файла. Компилятор генерирует один объектный файл для каждого исходного файла, и эти файлы помещаются в objпапку.

binПапка имеет двоичные файлы , которые являются фактическим исполняемым кодом приложения или библиотеки.

Каждая из этих папок подразделяется на папки Debugи Releaseпапки, которые просто соответствуют конфигурациям сборки проекта. Обсуждаемые выше два типа файлов помещаются в соответствующую папку, в зависимости от того, какой тип сборки вы выполняете. Это позволяет вам легко определить, какие исполняемые файлы созданы с использованием символов отладки, а какие были созданы с включенными оптимизациями и готовы к выпуску.

Обратите внимание, что вы можете изменить место, где Visual Studio выводит ваши исполняемые файлы во время компиляции, в свойствах вашего проекта. Вы также можете изменить имена и выбранные параметры для ваших конфигураций сборки.

Коди Грей
источник
4
По какой-то причине в моем проекте нет подпапки отладки или выпуска для папок obj и bin. Если я изменяю настройки своего проекта для построения в подпапку debug / release в зависимости от выбранной в данный момент конфигурации, я получаю сообщение об ошибке, что тип данных не может быть создан при отладке приложения. Мое приложение только когда-либо ищет в папке bin для DLL и никогда не знает, искать в папке отладки или выпуска. Как мне это исправить?
Анил Натха
3
@ Хитрый, я не понимаю, о чем ты спрашиваешь. Проект создает приложение (EXE) или библиотеку (DLL). Он не может построить оба. Поэтому, если ваш проект создает приложение, он не будет помещать какие-либо библиотеки DLL в папку bin. И если ваш проект создает библиотеку, вы получите ошибку при попытке отладки, потому что вы не можете выполнить DLL. В любом случае, похоже, что вы изменили путь вывода по умолчанию в свойствах вашего проекта. Если вам нужна дополнительная помощь, задайте новый вопрос. Обязательно хорошо документируйте проблему, включая скриншоты конфигурации вашего проекта, если это необходимо.
Коди Грей
2
Интересно, могу ли я заставить Visual Studio удалить папку obj после завершения сборки?
Johnny_D
2
@SlyRaskal Одна из причин, по которой у вас могут отсутствовать папки Debug / Release, заключается в том, что вы разрабатываете веб-проект?
Тим Илес
2
objДействительно ли содержат только несвязанные файлы объектного кода? По моему опыту, он содержит все из них, и на последнем этапе сборки файлы, которые являются частью "окончательного набора", копируются в bin.
ivan_pozdeev
44

Я бы посоветовал вам посмотреть это видео на YouTube, которое демонстрирует разницу между папками C # bin и obj, а также объясняет, как мы получаем преимущество от инкрементной / условной компиляции.

Компиляция C # представляет собой двухэтапный процесс, для получения более подробной информации см. Диаграмму ниже:

  1. Компиляция: На этапе компиляции отдельные файлы кода C # компилируются в отдельные скомпилированные блоки. Эти отдельные файлы скомпилированного кода находятся в каталоге OBJ.
  2. Связывание: На этапе связывания эти отдельные файлы скомпилированного кода связываются для создания единого DLL и EXE-файла. Это идет в каталоге BIN.

C # bin против obj папок

Если вы сравните каталог bin и obj, вы найдете большее количество файлов в каталоге obj, так как в нем есть отдельные файлы скомпилированного кода, в то время как «bin» состоит из одного модуля.

бин против объекта

Шивпрасад Койрала
источник
20

objКаталог для промежуточных объектных файлов и других временных файлов данных, которые генерируются системой компилятора или сборки во время сборки. binКаталог каталог, конечные выходные файлы (и любые зависимости или другие развертываемых файлы) будут записаны.

При желании вы можете изменить фактические каталоги, используемые для обеих целей в настройках проекта.

Давид Ференци Рогожан
источник
«bin» можно изменить в свойствах проекта -> «Build» -> «Output» -> «Output output». Но как насчет "obj"?
Питер Мортенсен
5

Один интересный факт о каталоге obj: если вы настроили публикацию в веб-проекте, файлы, которые будут опубликованы, размещаются в obj \ Release \ Package \ PackageTmp. Если вы хотите публиковать файлы самостоятельно, а не использовать встроенную функцию VS, вы можете взять файлы, которые вам действительно нужно развернуть, здесь, а не собирать весь цифровой мусор в каталоге bin.

Роджер Хилл
источник
0

Будьте осторожны с setupпроектами, если вы их используете; Проекты установки Visual Studio Primary Outputтянут из objпапки, а не из bin.

Я выпускал приложения, которые, по моему мнению, были запутаны и подписаны в msiнастройках в течение достаточно долгого времени, прежде чем я обнаружил, что файлы развернутых приложений на самом деле не были ни запутаны, ни подписаны, поскольку я выполнял процедуру пост-сборки для binсборок папки и должен был ориентироваться на objпапку сборки вместо.

Это далеко не интуитивно понятно imho, но общий setupподход заключается в использовании Primary Outputпроекта, а это objпапка. Я был бы рад, если бы кто-то мог пролить свет на это, кстати.

SteveCinq
источник