NLog - System.MethodAccessException 仅在 VMWare Horizo​​n View 客户端中

NLog - System.MethodAccessException only in VMWare Horizon View client

我更新了我的 C# WPF 应用程序以使用最新版本的 NLog 和 NLog.Extensions.Logging。

除此 VMWare Horizo​​ns 客户端外,它在任何地方都能正常工作,它会因以下错误而崩溃:

    $exception  {"Attempt by method 'NLog.Extensions.Logging.NLogLoggerProvider..ctor(NLog.Extensions.Logging.NLogProviderOptions, NLog.LogFactory)' to access method 'NLog.LogManager.get_LogFactory()' failed."}  System.MethodAccessException

该项目目前使用 NLog v4.5.11 和 NLog.Extensions.Logging v1.4

我的应用程序的先前版本使用 NLog v.4.4.12 和 NLog.Extensions.Logging v1.0 在此 VM 中工作,所以我试图回退到那个。然后我会逐步升级这些库的版本。

更多内容即将跟进...同时,我们非常欢迎您深入了解可能导致这种情况的原因。

using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var loggerFactory = new LoggerFactory();
            var Logger = loggerFactory.CreateLogger<Program>();

            loggerFactory.AddNLog();


            Logger.LogDebug($"============{Environment.NewLine}");

            Console.ReadLine();

        }
    }
}

您的部署有问题。您的应用程序未使用 NLog 版本。 4.5(但有些旧版本)。

LogFactory-属性 变成 public 这样:https://github.com/NLog/NLog/pull/2316

也许您在 Windows GAC 中注册了旧的 NLog? (全局程序集缓存)

也许可以尝试使用 Console.WriteLine 编写 typeof(NLog.LogFactory).Assembly-位置。

我会补充回答

这个问题是 Windows 8.

的实际问题

获取使用的路径 NLog.dll:

typeof(NLog.LogFactory).Assembly.Location

如果路径指向 C:\Windows\Microsoft.NET\assembly\GAC_MSIL 中的某处,则只需删除此文件

谢谢斯捷潘。 我记得,从 GAC 删除文件并不容易。根据我的了解,这不是一个好的做法,因为它可能会破坏另一个依赖它的应用程序。

Windows 安装程序在 GAC 中维护项目的引用计数,每次安装增加计数,每次卸载减少。如果计数变为 0,则该 dll 也会从 GAC 中删除。

我卸载了将Nlog 放入GAC 的应用程序。 (这是我很久以前写的另一个应用程序。)然后我修改了那个旧应用程序的安装程序,确保它没有把它放回 GAC 和 re-installed 它。一切又都好了。