Не удается добавить пакет 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» из сборки «System, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089».

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

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


person LP13    schedule 05.03.2018    source источник
comment
Я слышал, как кто-то из Microsoft упомянул, что ведение журнала событий будет включено в пакет расширений, поставляемый в .Net Core 2.1. Также существует более ранний вопрос Stackoverflow по той же теме stackoverflow.com/questions/39131217/   -  person JRB    schedule 06.03.2018


Ответы (2)


У меня был некоторый успех в .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();
            }
        }
    }
}
person programmerj    schedule 06.03.2018
comment
я подожду .. :) даже я serilog.sinks.eventlog не работает с .NET Core 2 - person LP13; 06.03.2018

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

person Mark G    schedule 01.10.2018