Разница между зависимостями проекта и dll в .Net в финальной скомпилированной сборке

Допустим, у меня есть два проекта A и B. A зависит от B. Я могу указать это двумя способами:

  • Включите A и B в одно решение и укажите B как зависимость проекта для A. Это отображается в проекте msbuild A как узел «ProjectReference».
  • Включите ссылку на скомпилированную dll B как зависимость для A. Это отображается в проекте msbuild A как узел «Ссылка».

У меня вопрос: как только я построю сборку для A, есть ли разница в конечном результате между этими двумя методами.

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


person Rohith    schedule 15.09.2010    source источник


Ответы (2)


Если исходники проекта B не изменились между двумя сборками проекта A, не будет никакой разницы в поведении вывода проекта A. Однако, если исходники проекта B изменились, ссылка на него как на проект из проекта A приведет к тому, что проект B также будет перестроен. Это различие определяет ваш выбор способа ссылки на проект B из проекта A:

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

  • если проект B является внешней зависимостью, которую вы не разрабатываете самостоятельно, или у вас нет источников, или если он уже был отправлен, и вы не можете отправить измененную версию с проектом A, вы хотите сослаться на предварительно созданный выход проекта B, чтобы убедиться, что вы разрабатываете и тестируете одну и ту же версию проекта B, которая, скорее всего, будет на компьютерах ваших пользователей.

person Franci Penov    schedule 15.09.2010
comment
@Timwi - спасибо за правильную настройку направления зависимости :-) По какой-то причине я написал это прямо противоположно примеру OP - person Franci Penov; 15.09.2010
comment
Также, чтобы добавить к ответу, в случае, если ваш проект B зависел, скажем, от C.dll, если B указан как зависимость проекта от A, компиляция проекта A автоматически принесет зависимости проекта B (например, C.dll). Вместо этого, если вы включите ссылку на скомпилированную dll B, у вас не будет автоматически добавляться C.dll в корзину A, вместо этого вам нужно будет вручную добавить все зависимости B. - person Giuseppe Romagnuolo; 07.09.2011

Добавление в качестве ссылки на проект имеет то преимущество, что сборка «B» создается автоматически, если это необходимо.

Как только сборка «А» построена, разницы нет.

person Hemant    schedule 15.09.2010