Подтвердить что ты не робот

Как работает 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, она начнет копироваться локально. Кто-нибудь может подтвердить, что это проблема?

4b9b3361

Ответ 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.

Подключить обратную связь