Во время компиляции проектов создаются две директории:

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

В процессе компиляции из исходного кода проекта создаётся dll. Происходит это в рамках таргета CoreCompile, где вызывается таска Csc. Одним из аргументов этой таски пеердаётся OutputAssembly - это путь, куда нужно сохранить скомпилированную dll. По умолчанию компиляция работает с obj директориями. При этом в obj директорию попадают только те файлы, которые были сгенерированы в процессе компиляции. Нет необходимости копировать туда зависимости, они указываются в csc как пути к .nuget/ или obj/ других проектов.

Запустить dll из директории obj невозможно. Чтобы собранное приложение можно было запустить выполняется копирование этой длл и всех зависимостей в директорию bin. Для этого выполняется таргет CopyFilesToOutputDirectory.

bin directory

obj directory

project.assets.json

Artifacts output

Начиная с dotnet 8, MSBuild поддерживает свойство UseArtifactsOutput, которое влияет на то, куда сохраняются файлы во время сборки. Обычно директории bin и obj складываются внутри директорий проектов, но в выставленным UseArtifactsOutput создаётся директория artifact в корне солюшена и внутри неё под каждый проект заводится директория, где будут хранится bin и obj.

Более подробно почитать можно в документации: https://learn.microsoft.com/en-us/dotnet/core/sdk/artifacts-output.