Как работает Copy-local? log4net.dll не копируется в каталог вывода MyProject
Мне интересно, что именно делает copy-local = true для ссылок. Скопирует ли ссылка на сборку вместе со всеми ее зависимостями в выходной каталог?
Мой сценарий следующий:
У меня есть обычная обертка журнала, которая использует log4net. Я создаю сборку релиза MyLogWrapper.dll с помощью набора log4net.dll для copy-local true. Ссылка на MyLogWrapper.dll из MyProject с локальным копированием, установленным в true, должна также скопировать файл log4net.dll? Я только ссылаюсь на MyLogWrapper.dll и ни одна из его зависимостей в MyProject. log4net.dll не копируется в выходной каталог MyProject, но все другие зависимости MyLogWrapper. В чем может быть проблема?
Я сделал еще несколько экспериментов, и кажется, что если я удалю сборку (log4net.dll) из GAC, она начнет копироваться локально. Кто-нибудь может подтвердить, что это проблема?
Ответы
Ответ 1
К сожалению, похоже, что в соответствии со следующим утверждением, взятым из документации MSDN, функция CopyLocal не работает должным образом для сборок, уже находящихся в GAC.
Если вы развертываете приложение, содержащее ссылку на пользовательский компонент, зарегистрированный в GAC, компонент не будет развернут вместе с приложением независимо от параметра CopyLocal. В предыдущих версиях Visual Studio вы могли установить свойство CopyLocal для ссылки, чтобы убедиться, что сборка была развернута. Теперь вы должны вручную добавить сборку в папку \Bin. Это ставит весь пользовательский код под пристальный взгляд, уменьшая риск публикации пользовательского кода, с которым вы не знакомы.
Более подробную информацию можно найти на следующей странице, в которой объясняются детали работы ссылок на проект.
MSDN: ссылки на проекты
Ответ 2
После запроса этого вопроса в MSDN здесь - похоже, что это поведение по дизайну. "Если вы разворачиваете/копируете приложение, содержащее ссылку на пользовательский компонент, зарегистрированный в GAC, компонент не будет развернут/скопирован с приложением независимо от параметра" Копировать локальное ".
Ответ 3
Есть трюк: установите для параметра Copy Local значение false, а затем снова значение true, а Visual Studio автоматически добавит личные метаданные для этой ссылки. По крайней мере, VS 2010 делает. Я недавно сделал это, чтобы решить проблему с нашим сервером сборки TFS, который по какой-то странной причине имел множество компонентов Enterprise Library, установленных в GAC, поэтому у нас были серьезные проблемы при развертывании нашего проекта из папки TFS Drop. Этот ложный/истинный трюк спас нас.
Ответ 4
Вам нужно быть немного настороженным, чтобы скопировать локальный, поскольку он меня поймал в прошлом!
Просто изредка для конкретного .dll он будет без проблем копировать его в папку сборки. Обычно это не отображается на dev-машине, поскольку DLL часто находится в GAC (если вы установили инструмент/библиотеку dev, который вы используете для разработки), и поэтому вы не заметите, пока не получите distrobuted/bundled в установщик и требуемые файлы отсутствуют на клиентской машине.
Об этой ошибке мало информации, но этот поток демонстрирует ее для конкретной библиотеки: здесь.
Будучи пойманным, я думаю, что это хорошая идея (как правило, в любом случае) точно знать, какие сборки необходимы вашему проекту и иметь script или подобное автоматическое действие, гарантирующее наличие всех необходимых компонентов, либо при построении, либо, более вероятно, при создании установщика или сборе файлов для распространения,
Ответ 5
Если для локальной копии установлено значение true, она скопирует все assemmbly, чей атрибут local copy = tue указывает на каталог bin.
В вашем случае dll может использовать другую dll, чтобы она также требовала.
Ответ 6
Я обнаружил, что в Visual Studio 2015 это больше не соблюдается с ссылками на проекты, если связанный проект имеет зависимость от сборки GAC. Сборник GAC всегда копируется на выход корневого проекта и копирует local = false, который соблюдается только в отношении вывода проекта, содержащего ссылку на DLL GAC.
Подключить обратную связь