NLog - System.MethodAccessException 仅在 VMWare Horizon View 客户端中
NLog - System.MethodAccessException only in VMWare Horizon View client
我更新了我的 C# WPF 应用程序以使用最新版本的 NLog 和 NLog.Extensions.Logging。
除此 VMWare Horizons 客户端外,它在任何地方都能正常工作,它会因以下错误而崩溃:
$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 它。一切又都好了。
我更新了我的 C# WPF 应用程序以使用最新版本的 NLog 和 NLog.Extensions.Logging。
除此 VMWare Horizons 客户端外,它在任何地方都能正常工作,它会因以下错误而崩溃:
$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 它。一切又都好了。