Почему я должен ссылаться на dll ExceptionHandling.Logging в клиентском коде? - PullRequest
4 голосов
/ 08 марта 2011

У меня есть слой доступа к данным, который скомпилирован в DLL. В этом слое я использую Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll, чтобы регистрировать исключения и затем возвращать их вызывающей стороне.

У меня есть клиентское приложение, которое ссылается на dll уровня доступа к данным, но не вызывает напрямую Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll. Я получаю следующее исключение времени выполнения в своем клиентском коде, когда возникает исключение на уровне доступа к данным, если я не добавляю ссылку на dll Enterprise Library из моего клиентского приложения.

Тип «Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, версия = 5.0.414.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad36vede» не может быть разрешен. Пожалуйста, проверьте правильность написания или полное имя типа.

Я не понимаю, почему клиенту необходимо ссылаться на dll Enterprise Library, даже если он не ссылается на нее в коде.

Любые мысли приветствуются.

Ответы [ 2 ]

7 голосов
/ 08 марта 2011

Все дело в локализации и привязке CLR к вашим сборкам во время выполнения.

Поскольку ваш клиент напрямую вызывает ваш файл DAL.dll, ему нужна ссылка на файл DAL.dll во время компиляции. Точно так же, поскольку ваш DAL.dll напрямую вызывает EL.Logging.dll, он требует ссылки на EL.Logging.dll во время компиляции.

Однако, поскольку клиент не зависит напрямую от EL.Logging.dll, для компиляции не требуется ссылка. Тем не менее, во время выполнения CLR должен будет найти и связать все 3 сборки: Client, DAL.dll и EL.Logging.dll.

От вас не требуется добавлять ссылку на компиляцию, но, установив для флага «Копировать локально» значение «true», вы развертываете EL.Logging.dll в папке «Клиент». Теперь во время выполнения все библиотеки DLL можно найти.

Другие способы достижения того же эффекта:

  • Регистрация корпоративной библиотеки в GAC
  • Создание действия пост-сборки
  • Вручную выполнить развертывание XCopy необходимых вам библиотек DLL
  • Укажите <codebase> в конфигурации для определения местоположения сборок
  • Используйте <probing> в конфигурации для поиска подкаталогов (вероятно, это не полезно для вас)
0 голосов
/ 08 марта 2011

Нет необходимости ссылаться на DLL библиотеки предприятия из вашего клиентского приложения.
Проблема в том, что файл не находится ни в GAC, ни в вашей папке bin. Он копируется, когда вы добавляете ссылку на него из своего проекта запуска (клиентское приложение), поскольку для свойства Копировать локально установлено значение True (по умолчанию).

В папку \ bin копируются только те библиотеки DLL, которые являются прямыми ссылками вашего проекта запуска.

Dll, которые являются ссылками на ссылки, НЕ копируются.

Другой способ, если вы не хотите напрямую ссылаться на файл dll, - это создать сценарий после сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...