Потребители библиотеки ссылаются на дополнительную сборку при использовании определенных типов - PullRequest
1 голос
/ 30 апреля 2010

У меня есть библиотечный код, который использует ICSharpCode.SharpZipLib для упрощения использования ZIP-файлов в качестве источников данных при выполнении интеграционных тестов.

В нынешнем виде, если я ссылаюсь на мою библиотеку из другого проекта, другой проект скомпилируется очень хорошо, но когда он обращается к коду, использующему SharpZipLib, я получаю исключение, так как он не находит библиотеку zip:

ошибка: System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'ICSharpCode.SharpZipLib, версия = 0.85.5.452, культура = нейтральная, PublicKeyToken = 1b03e6acf1164f73' или одна из ее зависимостей. Система не может найти указанный файл.

Если типы в моей библиотеке получены из класса в SharpZipLib, это приведет к ошибке компиляции CS0012. Какие еще способы есть для запуска CS0012, чтобы использование кода, который требует SharpZipLib (но явно не указывает это), приводил к сбою компиляции кода потребителя?

У меня были подобные проблемы в прошлом, когда я использовал такие библиотеки, как DeftTech.DuckTyping под капотом. Я добавляю код своей библиотеки в новый проект, начинаю работать, компилировать, запускать, а затем внезапно сталкиваюсь с крайним случаем, когда я использовал утку, чтобы обойти и получить ошибку времени выполнения.

Что бы я больше всего хотел, это иметь такое же поведение, как если бы я производил от типа в сторонней библиотеке, так что ссылка на мой производный тип генерирует CS0012:

Тип 'type' определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «сборка».

Ответы [ 3 ]

1 голос
/ 30 апреля 2010

Если вы видите это в Visual Studio, возможно, это связано с тем, что ICSharpCode.SharpZipLib.dll не копируется в папку сборки вашего «другого» проекта.

Так что это не будет проблемой, когда вы распространяете вашу библиотеку для потребления третьими лицами, поскольку ICSharpCode.SharpZibLib.dll будет находиться в той же папке, что и ваша библиотека.

Во время разработки и тестирования, хотя это может быть немного хлопотно. Как правило, при настройке многопроектного решения у меня просто все проекты нацелены на свою папку «Выход» на одну общую папку решения. Таким образом, все зависимости копируются в одно место для тестирования.

1 голос
/ 30 апреля 2010

Вы получаете ошибки компилятора, только если вы ПРЯМО взаимодействуете с библиотеками, на которые нет ссылок.

Если вы используете другие библиотеки, которые используют сторонние библиотеки, вы никогда не получите ошибку компилятора. Причина в том, что просто не имеет смысла иметь ошибку компиляции, потому что:

  • Это никак не влияет на компиляцию, так почему же ошибка компилятора?
  • Ваше приложение МОЖЕТ работать правильно, потому что нет никакой гарантии, что КОГДА-ЛИБО будет вызвана сторонняя библиотека.
  • Это может фактически сломать несколько библиотек, например, делайте ссылки на внешние библиотеки для отладки, но не отправляйте их для выпуска.

Редактировать: Если ваша проблема в том, что вы забыли о сторонней библиотеке, вы можете просто ссылаться на нее прямо из приложения, даже если вы никогда не используете ее. Тогда, например, Visual Studio автоматически скопирует его в папку выходного лотка и включит его в настройки и т. Д.

0 голосов
/ 02 марта 2012

Вам просто нужно скопировать ICSharpCodeSharpZipLib.dll в C:\Windows\assembly, и ваша проблема будет решена.

...