Tengo este fragmento de código en el proyecto de biblioteca de clases de marco .net, quiero reutilizarlo en el proyecto de biblioteca de clases estándar.net. Funciona como se esperaba, pero da un error de compilación en el proyecto estándar .net.

foreach (AppenderElement element in FX_CONNECT.EmailElement.Appenders)
{
    var smtpElement = (log4net.Appender.SmtpPickupDirAppender)AppLogger.Logger.Repository.GetAppenders().Where(appender => appender.Name.Equals(element.Name)).FirstOrDefault();
    if (smtpElement != null)
    {
        smtpElement.From = FX_CONNECT.EmailElement.From;
        smtpElement.To = FX_CONNECT.EmailElement.To;
        smtpElement.SmtpHost = FX_CONNECT.EmailElement.Server;
    }
}

Error para smtpElement.SmtpHost:

El error CS1061 'SmtpPickupDirAppender' no contiene una definición de 'SmtpHost' y no se puede encontrar ningún método de extensión accesible 'SmtpHost' que acepte un primer argumento del tipo 'SmtpPickupDirAppender' (¿falta una directiva de uso o una referencia de ensamblado?)

Versión de log4net en ambas aplicaciones 2.0.8.

Busqué en Internet pero no obtuve idea de cómo resolver este problema, por favor ayuda.

He visitado el sitio oficial de log4net, no es compatible con el estándar .net a partir de ahora.

https://logging.apache.org/log4net/release/framework-support.html

Entonces, ¿hay alguna solución para resolver esto?

-1
vivek nuna 11 jul. 2020 a las 04:48

2 respuestas

La mejor respuesta

Gracias @Claudio Redi por tu comentario, me dio la dirección correcta para resolver el problema.

Agregué la clase a continuación a mi proyecto y usé la clase SMTPAppender en lugar de log4net.Appender.SmtpPickupDirAppender en la línea var smtpElement = (SMTPAppender)AppLogger.Logger.Repository.GetAppenders().Where(appender => appender.Name.Equals(element.Name)).FirstOrDefault(); y está funcionando como se esperaba.

using log4net.Appender;
using log4net.Core;
using System.IO;
using System.Net.Mail;

namespace FxCore.Diagnostics.Components
{
    public class SMTPAppender : BufferingAppenderSkeleton
    {
        public string To { get; set; }
        public string From { get; set; }
        public string Subject { get; set; }
        public string SmtpHost { get; set; }
        public string Port { get; set; }

        protected void SendEmail(string messageBody)
        {
            SmtpClient client = new SmtpClient(SmtpHost);
            client.UseDefaultCredentials = false;
            client.Port = int.Parse(Port);
            using (MailMessage mailMessage = new MailMessage())
            {
                mailMessage.From = new MailAddress(From);
                mailMessage.To.Add(To);
                mailMessage.Body = messageBody;
                mailMessage.Subject = Subject;
                client.Send(mailMessage);
            }
        }

        protected override bool RequiresLayout => true;

        protected override void SendBuffer(LoggingEvent[] events)
        {
            StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);

            string t = Layout.Header;
            if (t != null)
            {
                writer.Write(t);
            }

            for (int i = 0; i < events.Length; i++)
            {
                // Render the event and append the text to the buffer
                RenderLoggingEvent(writer, events[i]);
            }

            t = Layout.Footer;
            if (t != null)
            {
                writer.Write(t);
            }

            SendEmail(writer.ToString());
        }
    }
}
0
vivek nuna 11 jul. 2020 a las 11:32