Не удалось добавить пакет Microsoft.Extensions.Logging.EventLog с приложением.NET Core 2

Так что согласно документации MS мы можем добавить EvventLog в качестве одного из провайдеров журналов. Однако, когда я добавляю Microsoft.Extensions.Logging.EventLog пакет в моем приложении.NET Core 2 Web Api. Я вижу желтую метку объяснения, как показано ниже

С таким предупреждением я все еще смог добавить EventLog в метод BuildWebHost

public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .UseUrls("http://*:40006")                
            .ConfigureLogging((hostingContext,logging)=> 
            {
                logging.AddEventLog(new Microsoft.Extensions.Logging.EventLog.EventLogSettings()
                {                    
                    SourceName = "MySource",
                });
            })
            .Build();

Однако, когда я запускаю приложение, я получаю ошибку

Не удалось загрузить тип 'System.Diagnostics.EventLog' из сборки 'Система, версия =4.0.0.0, культура = нейтральная, PublicKeyToken=b77a5c561934e089'.'

и предупреждение

Код серьезности Описание Состояние подавления строки файла проекта Предупреждение NU1701 Пакет "Microsoft.Extensions.Logging.EventLog 2.0.0" был восстановлен с использованием ".NETFramework,Version=v4.6.1" вместо целевой структуры проекта ".NETCoreApp,Version=v2.0'. Этот пакет может быть не полностью совместим с вашим проектом.

2 ответа

При использовании 2.0 вам нужно добавить ссылку на пакет Microsoft.Windows.Compatibility как описано в ASP.NET Core и Windows Event Log.

У меня был некоторый успех с этим в.NET Core 2.x:

using System;
using System.Runtime.InteropServices;

namespace Foo
{
    public enum EventLogType
    {
        EVENTLOG_SUCCESS = 0x000,
        EVENTLOG_AUDIT_FAILURE = 0x0010,
        EVENTLOG_AUDIT_SUCCESS = 0x0008,
        EVENTLOG_ERROR = 0x0001,
        EVENTLOG_INFORMATION = 0x0004,
        EVENTLOG_WARNING = 0x0002
    }

    public static class EventLog
    {
        [DllImport("advapi32.dll", EntryPoint = "RegisterEventSource", SetLastError = true)]
        public static extern long RegisterEventSource(string lpUNCServerName, string lpSourceName);

        [DllImport("advapi32.dll", EntryPoint = "DeregisterEventSource", SetLastError = true)]
        public static extern int DeregisterEventSource(IntPtr hHandle);

        [DllImport("advapi32.dll", SetLastError = true)]
        static extern int ReportEvent(IntPtr hHandle, ushort wType, ushort wCategory, uint dwEventID, IntPtr uSid, ushort wStrings, uint dwDataSize, string[] lpStrings, byte bData);

        public static void Write(string source, string message, EventLogType type)
        {
            int lastError = -1;
            IntPtr handle = IntPtr.Zero;
            string[] strs = new string[2];

            long rawHandle64 = RegisterEventSource(null, source);
            handle = new IntPtr(rawHandle64);

            lastError = Marshal.GetLastWin32Error();

            if (lastError == 0)
            {
                strs[0] = source;
                strs[1] = message;

                int res = ReportEvent(handle, (ushort)type, 0, 0, IntPtr.Zero, 2, 0, strs, 0);

                lastError = Marshal.GetLastWin32Error();

                DeregisterEventSource(handle);

                lastError = Marshal.GetLastWin32Error();
            }
        }
    }
}
Другие вопросы по тегам