Как работает Copy-local? log4net.dll не копируется в выходной каталог MyProject
Мне интересно, что именно делает 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 ответов
К сожалению, похоже, что согласно следующему утверждению, взятому из документации MSDN, функция CopyLocal не работает должным образом для сборок, уже находящихся в GAC.
Если вы развернете приложение, содержащее ссылку на пользовательский компонент, зарегистрированный в GAC, этот компонент не будет развернут вместе с приложением, независимо от параметра CopyLocal. В предыдущих версиях Visual Studio вы могли установить свойство CopyLocal для ссылки, чтобы убедиться, что сборка была развернута. Теперь вы должны вручную добавить сборку в папку \Bin. Это тщательно проверяет весь пользовательский код, снижая риск публикации пользовательского кода, с которым вы не знакомы.
Дополнительную информацию можно найти на следующей странице, которая объясняет детали работы ссылок на проекты.
Задав этот вопрос на MSDN здесь - кажется, что это поведение является намеренным. "Если вы развертываете / копируете приложение, которое содержит ссылку на пользовательский компонент, зарегистрированный в GAC, этот компонент не будет развертываться / копироваться с приложением, независимо от параметра" Копировать локально "."
Есть хитрость: установите для ссылки "Копировать локально" значение "ложь", а затем снова значение "истина", и Visual Studio автоматически добавит личные метаданные для этой ссылки. По крайней мере, VS 2010 делает. Я недавно сделал это, чтобы решить проблему с нашим сервером сборки TFS, на котором по какой-то странной причине было много компонентов Enterprise Library, установленных в GAC, поэтому у нас были серьезные проблемы при развертывании нашего проекта из папки TFS Drop. Этот ложный / истинный трюк спас нас.
Вы должны быть немного осторожны с копией местного, так как это застало меня врасплох в прошлом!
Просто для определенного.dll он молча не сможет скопировать его в папку сборки. Обычно это не отображается на компьютере разработчика, поскольку библиотеки DLL также часто присутствуют в GAC (если вы установили инструмент / библиотеку разработчика, которую вы используете для разработки), и поэтому вы не замечаете, пока он не будет распространен / собран в установщик и необходимые файлы отсутствуют на клиентском компьютере.
Об этой ошибке не так много информации, но этот поток демонстрирует ее для конкретной библиотеки: здесь.
Пойманный этим, я думаю, что это хорошая идея (как правило, в любом случае), чтобы точно знать, какие сборки требуются вашему проекту, и иметь сценарий или подобное автоматическое действие, которое обеспечивает присутствие всех необходимых компонентов, либо при сборке, или более вероятно, когда вы делаете установщик или собираете файлы для распространения,
Когда для локальной копии установлено значение true, она будет копировать все сборки, атрибут которых local copy = tue, в каталог bin приложения.
В вашем случае dll может использовать другую dll, так что это также требует этого.
Я обнаружил, что это больше не соблюдается в Visual Studio 2015 со ссылками на проекты, если указанный проект имеет зависимость от сборки GAC. Сборка GAC всегда копируется в выходные данные корневого проекта и копирует local = false, соблюдая только выходные данные проекта, содержащие ссылку на dll GAC.