Возможный дубликат:
Как работает копирайт?
У меня следующая ситуация:
- существует проект с именем OLAF.Tools, и этот проект ссылается на Microsoft.Data.SqlXml в C:\Program Files\SQLXML 4.0\bin\Microsoft.Data.SqlXml.dll. Для свойства Reference Copy Local установлено значение True. Когда я создаю этот проект в каталоге bin, я могу видеть как OLAF.Tools.dll, так и Microsoft.Data.SqlXml.dll
- есть консольное приложение с именем OLAF.Generator, и это приложение ссылается на OLAF.Tools(я добавил ссылку, используя вкладку Project). Когда я создаю это приложение в каталоге bin, я вижу только файлы OLAF.Generator.exe и OLAF.Tools.dll - там нет файла Microsoft.Data.SqlXml.dll, что меня удивляет. Еще одна странная вещь: даже если эта dll отсутствует, приложение выполняется правильно.
Итак, мои вопросы:
- Почему Microsoft.Data.SqlXml.dll не скопирован в папку bin в консольном приложении OLAF.Generator?
- как приложение разрешает каталог, где находится файл Microsoft.Data.SqlXml.dll?
Спасибо, 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.