Почему log4net 1.2.10 требует System.Web? - PullRequest
7 голосов
/ 08 июня 2011

Я пишу этот код в консольном приложении, ориентированном на клиентский профиль .NET Framework 4.

this.container.AddFacility<LoggingFacility>(
  f => f.LogUsing(LoggerImplementation.Log4net));

При запуске происходит ошибка с преобразованием типов.

Не удалось преобразовать из 'Castle.Services.Logging.Log4netIntegration.Log4netFactory, Castle.Services.Logging.Log4netIntegration, Версия = 2.5.1.0, Culture = нейтрально, PublicKeyToken = 407dd0808d44fbdc» в System.Type - может быть, тип не может быть найденным

Это связано с тем, что сборка Castle.Services.Logging.log4netIntegration не копируется в выходную папку. Как зависимость только во время выполнения, это не нарушает сборку.

Глядя на процесс сборки, я обнаружил, что он не копирует log4net или сборку средства Castle, поскольку они зависят от System.Web, который недоступен в профиле клиента. Изменение стандартного профиля означает, что эта зависимость доступна и средство может быть добавлено.

Почему это должно быть сделано? Какая разница, что я не нацеливаюсь на профиль клиента в консольном приложении, предназначенном для использования в качестве запланированной задачи на сервере?

Ответы [ 2 ]

7 голосов
/ 08 июня 2011

Некоторые из приложений зависят от System.Web, например, AspNetTraceAppender.Единственным другим вариантом, доступным для разработчиков, было бы разделение компонентов, которые не зависят от ядра системы, на отдельные сборки, но это сломало бы прелесть log4net в том, что он настолько прост в использовании.Кроме того, на момент написания log4net я не считаю, что это была такая вещь, как Профиль клиента.

Поскольку log4net является открытым исходным кодом, ничто не мешает вам загрузить исходный код и удалить классы, вызывающие проблемы, и создать свойСобственная клиентская база данных, ориентированная на сборку log4net.

http://www.thecodeking.co.uk/2010/08/making-log4net-work-with-net-client.html

  1. Загрузить исходный код log4net
  2. Открыть и обновить решение с помощью Visual Studio 2010
  3. Удалите ссылку на проект System.Web
  4. Исключите класс Appender \ AspNetTraceAppender.cs из проекта
  5. Добавьте ссылку на System.Configuration
  6. Перейдите в Project -> свойства log4net,и выберите вкладку приложения
  7. Измените целевую платформу на .NET Framework 3.5 Профиль клиента
  8. Перейдите на вкладку «Сборка» и измените конфигурацию на «Отладка»
  9. в разделе «Условные символы компиляции».для NET; NET_1_0; NET_2_0;
  10. Измените конфигурацию на Выпуск
  11. Под Coсимволы условной компиляции заменяют это на STRONG; NET; NET_1_0; NET_2_0;
  12. . Отредактируйте класс AssemblyInfo.cs и обновите атрибут AssemblyKeyFile, указав допустимый сильный ключ.
  13. Скомпилируйте проект в режиме Release и распространитеновая сборка
0 голосов
/ 08 июня 2011

Вот мои мысли: Log4Net использует System.Web, потому что разработчики решили, что это лучший вариант.

Если вам не нужен этот вес, рассмотрите проект ведения журнала, который не требует System.Web. Есть и другие варианты.

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