2008-09-25 16 views
9

tengo una aplicación de subproceso único que carga varios montajes en tiempo de ejecución utilizando la siguiente:¿Cómo uso una referencia común de log4net en ensamblajes cargados en tiempo de ejecución?

objDLL = Assembly.LoadFrom(strDLLs[i]); 

Me gustaría que los ensamblados cargados de esta manera de utilizar la misma referencia log4net.ILog como el resto de los conjuntos de hacer . Pero parece que los ensamblados cargados en el tiempo de ejecución tienen una referencia diferente y necesitan su propia configuración. ¿Alguien sabe si se puede usar un solo log4net.ILog en los ensamblajes cargados en tiempo de ejecución utilizando una interfaz .NET?

Aquí es la creación log4net.ILog y el código de apoyo en la clase del Programa:

// Configure log4net using the .config file 
    [assembly: log4net.Config.XmlConfigurator(Watch = true)] 

    public static class Program 
    { 
     private static log4net.ILog m_Log = null; 

     [STAThread] 
     public static void Main(string[] args) 
     { 
     try 
     { 
      m_Log = log4net.LogManager.GetLogger(
       MethodBase.GetCurrentMethod().DeclaringType); 
     } 

     } 
    } 
+0

¿Por qué los necesitaría a todos para tener el mismo ILog? Puede tener un ILog por clase, y todos se conectan al registrador de raíz de forma predeterminada. –

Respuesta

2

Si todos sus montajes implementan una interfaz común, entonces usted podría tener un parámetro de propiedad o constructor que le permite pasar su instancia local de ILog a los ensamblados dinámicamente cargados.

0

Algo sobre la clase cargada en tiempo de ejecución impide que funcione el ILog por clase habitual. Puedo obtener una instancia de ILog válida, pero a diferencia de todas las demás instancias, parece que no está configurada (todos los indicadores de Habilitado ** están configurados en falso). Tal vez el registrador "raíz" no es accesible para las clases cargadas en el tiempo de ejecución ???

1

Puede obtener el mismo registrador especificando una cadena de nombre de registrador literal, obteniendo así la misma instancia de registrador.

log4net.LogManager.GetLogger("SomeLogger"); 
0

Tengo una solución estúpida. Puede establecer XmlConfiguration en el archivo principal de configuración de log4net.

[assembly: log4net.Config.XmlConfigurator(ConfigFile="<configpath>",Watch = true)] 

No es realmente belleza ... pero funciona.

1

Esta respuesta llega con 4 años de retraso, pero acabo de encontrar el mismo problema. En mi caso, descubrí que el ensamblaje que se estaba cargando (desde una carpeta diferente al ensamblado que llama) también estaba cargando su propia instancia de log4net.

Resolví el problema al eliminar el archivo log4net.dll de la carpeta donde se estaba cargando el ensamblado en tiempo de ejecución.

+0

¡OMG! Éste resolvió mi problema cuando el registro en ensamblajes cargados dinámicamente nunca funcionó, mientras que funcionaba bien cuando los ensamblajes eran referencia en el proyecto. –

Cuestiones relacionadas