Ответ 1
Как работает Copy-local? log4net.dll не копируется в каталог вывода MyProject - это ответ на мой вопрос. Когда библиотека установлена в GAC, она не будет скопирована, даже если используется параметр COPY LOCAL.
Возможный дубликат:
Как работает копирайт?
У меня следующая ситуация:
Итак, мои вопросы:
Спасибо, Pawel
ИЗМЕНИТЬ 1: (после ответа от Марк Гравелл)
@Marc Gravell. Ваш ответ дал мне пищу для размышлений, поскольку я мог поклясться, что всегда могу видеть косвенно зависимые сборки в главном каталоге bin приложения. И ИМХО, я не согласен с тобой - со всем уважением:)
Конечно, ссылки физически не каскадируются (речь идет о сильной связи с классами, интерфейсами и т.д.) - и это именно то, чего я хотел достичь при создании библиотеки OLAF.Tools. Эта библиотека обеспечивает уровень абстракции, содержит фабрики, а один factory принимает в качестве строки параметров и возвращает интерфейс. В одной конкретной реализации этого интерфейса используются компоненты Microsoft.Data.SqlXml. В результате, OLAF.Generator использует интерфейс, который находится в OLAF.Tools, но не знает о компонентах в Microsoft.Data.SqlXml.
Кроме того (я думаю, что мы оба знаем, что я пытался объяснить в предыдущем абзаце), при создании приложения зависимые сборки должны быть скопированы (если для параметра "Копировать локальное" установлено значение "ИСТИНА" ). Я просто написал пример приложения, Project B lib имеет ссылку на Project A lib, а Project C (консольное приложение) имеет ссылку на Project B. В каталоге bin проекта C я могу увидеть все: Project A.dll, Project B.dll и Project c.exe. Поэтому в обсуждаемом сценарии причина, по которой Microsoft.Data.SqlXml не попадает в папку OLAF.Generator bin, имеет какое-то отношение к самой этой сборке.
Знает ли компилятор/визуальная студия, что Microsoft.Data.SqlXml находится в директории, которая автоматически проверяется (или в GAC), и именно поэтому сборка не копируется?
EDIT 2: Я только что проверил GAC, и действительно, Microsoft.Data.SqlXml.dll установлен в GAC.
Как работает Copy-local? log4net.dll не копируется в каталог вывода MyProject - это ответ на мой вопрос. Когда библиотека установлена в GAC, она не будет скопирована, даже если используется параметр COPY LOCAL.
Ссылки не автоматически каскадируются, поэтому добавление ссылки на OLAF.Tools также не добавляет ссылки на SQLXML. Если вы хотите развернуть SQLXML с вашим exe, то наиболее удобным способом это будет явно добавить ссылку на SQLXML из вашего exe и установить его для копирования локально. Без этого он не будет развернут. В принципе, бремя на разработчиков заключается в том, чтобы решить, какие файлы на самом деле нужны во время выполнения (что часто является подмножеством используемых ссылок и зависит от ряда решений по развертыванию, которые только вы можете знать).
Как он разрешен во время выполнения... Пути обнаружения - это немного черное искусство, в основном это означает "папка приложения", но это зависит от конфигурации, и, возможно, с GAC можно консультироваться. Вы также можете предоставить свой собственный резольвер через AppDomain.Current.AssemblyResolve
.