У нас похожая проблема, ведь нам нужно заниматься 109 отдельными проектами. Чтобы ответить на исходные вопросы, основанные на нашем опыте:
1. Как лучше всего обрабатывать ссылки между проектами
Мы используем опцию контекстного меню «добавить ссылку». Если выбран «проект», то по умолчанию зависимость добавляется в наш единственный глобальный файл решения.
2. Должно быть включено или выключено "копирование локально"?
По нашему опыту. Дополнительное копирование просто увеличивает время сборки.
3. Должен ли каждый проект строиться в своей собственной папке или все они должны строиться в одной выходной папке (все они являются частью одного приложения)
Весь наш вывод помещается в единую папку под названием «bin». Идея в том, что эта папка такая же, как и при развертывании программного обеспечения. Это помогает предотвратить проблемы, возникающие, когда настройка разработчика отличается от настройки развертывания.
4. Папки решений - хороший способ упорядочить вещи?
Нет, по нашему опыту. Структура папок для одного человека - кошмар для другого. Глубоко вложенные папки просто увеличивают время, необходимое для поиска чего-либо. У нас есть полностью плоская структура, но мы одинаково называем файлы проекта, сборки и пространства имен.
Наш способ структурирования проектов основан на одном файле решения. Строительство занимает много времени, даже если сами проекты не изменились. Чтобы помочь с этим, мы обычно создаем еще один файл решения «текущего рабочего набора». К этому добавляются любые проекты, над которыми мы работаем. Время сборки значительно улучшено, хотя одна проблема, которую мы видели, заключается в том, что Intellisense не работает для типов, определенных в проектах, которых нет в текущем наборе.
Частичный пример макета нашего решения:
\bin
OurStuff.SLN
OurStuff.App.Administrator
OurStuff.App.Common
OurStuff.App.Installer.Database
OurStuff.App.MediaPlayer
OurStuff.App.Operator
OurStuff.App.Service.Gateway
OurStuff.App.Service.CollectionStation
OurStuff.App.ServiceLocalLauncher
OurStuff.App.StackTester
OurStuff.Auditing
OurStuff.Data
OurStuff.Database
OurStuff.Database.Constants
OurStuff.Database.ObjectModel
OurStuff.Device
OurStuff.Device.Messaging
OurStuff.Diagnostics
...
[etc]