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

Копирование косвенной ссылки на сборку в выходной каталог - сборка отсутствует

Возможный дубликат:
Как работает копирайт?

У меня следующая ситуация:

  • существует проект с именем 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.

4b9b3361

Ответ 2

Ссылки не автоматически каскадируются, поэтому добавление ссылки на OLAF.Tools также не добавляет ссылки на SQLXML. Если вы хотите развернуть SQLXML с вашим exe, то наиболее удобным способом это будет явно добавить ссылку на SQLXML из вашего exe и установить его для копирования локально. Без этого он не будет развернут. В принципе, бремя на разработчиков заключается в том, чтобы решить, какие файлы на самом деле нужны во время выполнения (что часто является подмножеством используемых ссылок и зависит от ряда решений по развертыванию, которые только вы можете знать).

Как он разрешен во время выполнения... Пути обнаружения - это немного черное искусство, в основном это означает "папка приложения", но это зависит от конфигурации, и, возможно, с GAC можно консультироваться. Вы также можете предоставить свой собственный резольвер через AppDomain.Current.AssemblyResolve.