2011-06-08 8 views
7

Escribo este código en una aplicación de consola orientada a .NET Framework 4 Client Profile.¿Por qué log4net 1.2.10 requiere System.Web?

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

Cuando se ejecuta, falla con un error de conversión de tipo.

No se pudo convertir de 'Castle.Services.Logging.Log4netIntegration.Log4netFactory, Castle.Services.Logging.Log4netIntegration, Version = 2.5.1.0, Culture = neutral PublicKeyToken = 407dd0808d44fbdc' a System.Type - tal vez el tipo no pudo ser encontrado

Esto se debe a la asamblea Castle.Services.Logging.log4netIntegration no se copia en la carpeta de salida. Como una dependencia solo de tiempo de ejecución, esto no rompe la construcción.

Al observar el proceso de compilación, descubrí que no estaba copiando log4net o el conjunto de instalación de Castle porque dependen de System.Web que no está disponible en el Perfil del cliente. Cambiar al perfil estándar significa que esta dependencia está disponible y que se puede agregar la instalación.

¿Por qué se hace esto? ¿Qué diferencia hace que no apunte al perfil del cliente en una aplicación de consola diseñada para ser utilizada como una tarea programada en un servidor?

Respuesta

7

Algunos de los appenders dependen de System.Web como AspNetTraceAppender. La única otra opción disponible para los desarrolladores habría sido dividir los componentes que no dependen del núcleo del sistema en ensamblajes separados, pero eso habría roto la belleza de log4net en cuanto a que es tan simple de usar. Además, en el momento de escribir log4net, no creo que fuera un perfil de cliente.

Desde log4net es de código abierto no hay nada que nos impida la descarga de la fuente y la eliminación de las clases ofensivas y crear su propio perfil de cliente ensamblaje log4net céntrica.

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

  1. Descargar la fuente log4net
  2. abierto & actualizar la solución utilizando Visual Studio 2010
  3. Retire la referencia del proyecto System.Web
  4. Excluir clase Appender de \ AspNetTraceAppender.cs del proyecto
  5. Agregue una referencia a System.Configuration
  6. Vaya a Proyecto -> log4net propiedades y seleccione la pestaña de aplicaciones
  7. cambiar el marco de destino para .NET Framework 3.5 Perfil de cliente
  8. Seleccione la ficha Generar y cambie la configuración a Depurar
  9. En Símbolos de compilación condicionales, cambie esto a NET; NET_1_0; NET_2_0;
  10. Cambie la configuración a Release
  11. En Símbolos de compilación condicional, cambie esto a STRONG; NET; NET_1_0; NET_2_0;
  12. Editar la clase AssemblyInfo.cs y actualizar el atributo AssemblyKeyFile con un fuerte válida clave
  13. Compilar el proyecto en modo de la versión y el nuevo conjunto de
+0

Gracias Bronumski. –

+1

Acaba de descargar los últimos binarios (1.2.11) y contiene una versión compatible con 4.0 Client Profile en \ bin \ net-cp \ 4.0 \ release. ¡Lo probé y funciona como un encanto! – SvenG

-4

Estos son mis pensamientos: Log4Net usa System.Web porque los desarrolladores decidieron que esta era la mejor opción.

Si no desea este peso, considere un proyecto de registro que no requiera System.Web. Hay otras opciones

+0

Bit de una respuesta vaga. ¿Cuáles son las otras opciones de registro? Solo utilizo log4net o los componentes principales de diagnóstico yo mismo. – Bronumski

+0

Me encanta el desbordamiento de pila 'AttemptKillOfReputation()' porque no se hizo todo el trabajo para mí. –

+8

Sentí que su respuesta fue más desdeñosa que útil. –

Cuestiones relacionadas