Как работает Copy-local? log4net.dll не копируется в выходной каталог MyProject - PullRequest
45 голосов
/ 26 ноября 2008

Мне интересно, что именно делает copy-local = true для ссылок. Копирует ли указанная сборка вместе со всеми своими зависимостями в выходной каталог?

Мой сценарий следующий: У меня есть пользовательская оболочка журнала, которая использует log4net. Я создаю сборку релиза MyLogWrapper.dll со ссылкой log4net.dll, установленной на локальную копию true. Ссылка MyLogWrapper.dll из MyProject с копией local, установленной в true, должна привести к копированию log4net.dll, верно? Я ссылаюсь только на MyLogWrapper.dll и ни на одну из его зависимостей в MyProject. log4net.dll не копируется в выходной каталог MyProject, но все остальные зависимости MyLogWrapper есть. В чем может быть проблема?

Я провел еще несколько экспериментов, и кажется, что если я удаляю сборку (log4net.dll) из GAC, она начинает копироваться локально. Кто-нибудь может подтвердить, что это проблема?

Ответы [ 6 ]

31 голосов
/ 10 июня 2009

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

Если вы развернете приложение, содержащее ссылку на пользовательский компонент, зарегистрированный в GAC, этот компонент не будет развернут вместе с приложением, независимо от параметра CopyLocal. В предыдущих версиях Visual Studio вы могли установить свойство CopyLocal для ссылки, чтобы убедиться, что сборка была развернута. Теперь вы должны вручную добавить сборку в папку \ Bin. Это тщательно проверяет весь пользовательский код, снижая риск публикации пользовательского кода, с которым вы не знакомы.

Дополнительную информацию можно найти на следующей странице, которая объясняет детали работы ссылок на проекты.

MSDN: Проектные ссылки

10 голосов
/ 26 ноября 2008

Задав этот вопрос на MSDN здесь - похоже, такое поведение предусмотрено. «Если вы развернете / скопируете приложение, содержащее ссылку на пользовательский компонент, зарегистрированный в GAC, компонент не будет развернут / скопирован с приложением, независимо от параметра« Копировать локально ».»

7 голосов
/ 08 октября 2012

Существует хитрость: установите для ссылки «Копировать локально» значение «ложь», а затем снова для значения «истина», и Visual Studio автоматически добавит личные метаданные для этой ссылки. По крайней мере, VS 2010 делает. Я недавно сделал это, чтобы решить проблему с нашим сервером сборки TFS, на котором по какой-то странной причине было много компонентов Enterprise Library, установленных в GAC, поэтому у нас были серьезные проблемы при развертывании нашего проекта из папки TFS Drop. Этот ложный / истинный трюк спас нас.

5 голосов
/ 26 ноября 2008

Вы должны быть немного осторожны с копией локального, поскольку это поймало меня в прошлом!

Иногда для определенного .dll он молча не может скопировать его в папку сборки. Обычно это не отображается на компьютере разработчика, поскольку библиотеки DLL также часто присутствуют в GAC (если вы установили инструмент / библиотеку разработчика, которую вы используете для разработки), и поэтому вы не замечаете, пока он не будет распространен / собран в установщик и необходимые файлы отсутствуют на клиентском компьютере.

Существует немного информации об этой ошибке, но этот поток демонстрирует ее для конкретной библиотеки: здесь .

Пойманный этим, я думаю, что это хорошая идея (как правило, в любом случае), чтобы точно знать, какие сборки требуются вашему проекту, и иметь скрипт или аналогичное автоматическое действие, которое обеспечивает присутствие всех необходимых компонентов, либо когда вы создаете, или, скорее всего, когда вы делаете установщик или собираете файлы для распространения,

4 голосов
/ 26 ноября 2008

Если для локальной копии задано значение true, она скопирует все сборки, атрибут которых local copy = tue, в директорию bin приложения.

В вашем случае dll может использовать другую dll, поэтому она также требует этого.

0 голосов
/ 18 сентября 2015

Я обнаружил, что это больше не соблюдается в Visual Studio 2015 со ссылками на проекты, если указанный проект имеет зависимость от сборки GAC. Сборка GAC всегда копируется в выходные данные корневого проекта и копирует local = false, соблюдая только выходные данные проекта, содержащие ссылку на dll GAC.

Обратная связь

...