【问题标题】:NLog - System.MethodAccessException only in VMWare Horizon View clientNLog - System.MethodAccessException 仅在 VMWare Horizo​​n View 客户端中
【发布时间】:2022-03-30 21:15:19
【问题描述】:

我更新了我的 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();

        }
    }
}

【问题讨论】:

    标签: c# vmware nlog


    【解决方案1】:

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

    LogFactory-property 公开如下:https://github.com/NLog/NLog/pull/2316

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

    也许尝试使用 Console.WriteLine 编写 typeof(NLog.LogFactory).Assembly-location。

    【讨论】:

    • 罗尔夫,谢谢。你说的对!我已经激活了内部日志,它确实显示正在从 GAC 加载 nlog。我什至尝试使用 GacUtil.exe 删除它,但它不会删除它,因为另一个应用程序引用了它。我该如何解决这个问题?问候哈比布
    • GAC 中的 Nlog:NLog,Version=4.0.0.0,Culture=neutral,PublicKeyToken=5120e14c03d0593c 我的应用程序使用 nlog 4.5,但它也具有相同的版本和 publicKeyToken。因为版本和 PublicKeyTokens 相同,GAC 是否可以优先于安装文件夹中的那个?我曾经使用 gacutil.exe /i 将新版本导入 GAC。那行得通。以前的应用程序也可以正常工作。我可以强制应用程序使用安装文件夹中的 dll,忽略 GAC 吗?
    • 认为避免 GAC 的唯一方法是执行 ILMerge,或使用 NetCore。
    • 只需删除 dll,其路径将显示 'typeof(NLog.LogFactory).Assembly.Location'。这个 GAC 问题实际上是针对 Windows 8
    【解决方案2】:

    我会补充回答https://stackoverflow.com/a/54557849/8081796

    此问题在 Windows 8 中是实际存在的。

    获取使用的 NLog.dll 的路径:

    typeof(NLog.LogFactory).Assembly.Location
    

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

    【讨论】:

      【解决方案3】:

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

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

      我卸载了将 Nlog 放入 GAC 的应用程序。 (这是我很久以前编写的另一个应用程序。)然后我修改了那个旧应用程序的安装程序,确保它没有将它放回 GAC 并重新安装它。一切都恢复了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多