Когда должно быть установлено значение copy-local равным true, а когда нет?

Мне интересно, есть ли какие-либо эвристики, когда устанавливать copy-local=true для ссылок?

Если ссылочные типы используются только внутри, я могу установить copy-local в true, но если ссылочные типы отображаются как параметры или возвращаемые значения, я устанавливаю copy-local в false и укажу, что конкретная версия зависимости должна быть ссылкой, когда моя библиотека должна использоваться?

Может ли кто-нибудь прояснить это для меня?

Ответ 1

Копирование локального файла важно для сценариев развертывания и инструментов. Как правило, вы должны использовать CopyLocal = True, если ссылка не содержится в GAC.

Скопировать локально по существу означает, что я должен вручную развернуть эту DLL, чтобы мое приложение работало. Когда оно ложно, это по существу означает "Я полагаюсь на другой компонент, который должен быть установлен отдельно или закодирован, DLL будет уже там".

Ответ 2

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

CopyLocal особенно больно при создании больших исходных деревьев. Возник вопрос о том, как отключить CopyLocal здесь, на SO, вы можете увидеть его в Как переопределить параметр CopyLocal (Private) для ссылок в .NET из MSBUILD. А также Лучшие практики для крупных решений в Visual Studio (2008).

Я написал о том, как справиться с построением больших исходных деревьев в статье MSBuild: лучшие практики для создания надежных сборок, часть 2.

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

Ответ 3

Это действительно о целевой среде. Если локальная копия является ложной, вы говорите, что сборка уже существует в целевой среде (обычно в GAC). Установив его в true, он будет отображаться на выходе вашей сборки, поэтому упрощается развертывание в целевой среде.

Ответ 4

Ознакомьтесь со следующей ссылкой MSDN, в которой подробно описывается поведение CopyLocal.

Ссылки на проекты

К сожалению, есть некоторые причуды, и CopyLocal не будет работать так, как ожидалось, для ссылок на сборки во вторичных сборках, структурированных, как показано ниже.

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll(если в GAC CopyLocal не будет копироваться в папку MainApp bin)

Это затрудняет развертывание xcopy, если вы не планируете устанавливать стороннюю сборку в GAC на целевой машине.

Ответ 5

Этот параметр влияет только на фазу сборки. Он просто копирует ссылку на локальный каталог встроенной сборки.

Если другая сборка (T) хочет использовать метод из сборки, которую вы строите (A), которая имеет тип возврата или параметры из другой ссылочной сборки (R), она (T) должна иметь доступ к этой сборке (R). Он мог бы сделать это, не делая ничего особенного, если ссылочная сборка (R) установлена ​​в GAC. В противном случае ему нужна локальная копия.

Ответ 6

Set CopyLocal = false улучшит время сборки, но может вызвать различные проблемы во время развертывания.

Мой опыт с настройкой CopyLocal = false не был успешным. См. Резюме pro и cons в моем сообщении в блоге " НЕ ИЗМЕНЯЙТЕ ссылки" Копировать локальные "на false, если не понимать подпоследовательности."