我想,是因为 x32 版本的 NLog.dll,加载了 Nuget。
好的,让我们尝试验证这个假设。首先,我使用dotnet new console 创建了一个新项目,然后我构建了几次,dotnet build、dotnet build -r win-x86、dotnet build -r win-x64。然后,我使用ILSpy 来检查 dll。对于win-x64 构建,ILSpy 告诉我“// 架构:x64”。对于win-x86 构建,ILSpy 告诉我“// 架构:x86”。而没有指定运行时的构建,ILSpy 告诉我“// 架构:AnyCPU(首选 64 位)”。
现在,将 NLog 添加为 PackageReference,然后构建,我在我的 bin 目录中得到一个 nlog.dll,并在 ILSpy 中打开它,我看到“// Architecture: AnyCPU (64-bit Preferred)”。
因此,我断定NLog不是32位的。
如果你觉得这不够有说服力,这是我的 Program.Main 方法:
static void Main(string[] args)
{
var console = new NLog.Targets.ConsoleTarget();
var config = new LoggingConfiguration();
config.AddRule(LogLevel.Info, LogLevel.Fatal, console);
NLog.LogManager.Configuration = config;
var logger = NLog.LogManager.GetCurrentClassLogger();
int bits = Environment.Is64BitProcess ? 64 : 32;
logger.Info($"Running {bits}-bit process");
}
使用dotnet run、dotnet run -r win-x86 和dotnet run -r winx64 运行此程序,我从未见过崩溃,三个执行中的两个告诉我该进程是 64 位的,其中一个告诉我该进程是 32 位的。由于我使用 NLog 将其输出到控制台,因此我确信 NLog 可以在两种指令集架构中工作。
事实上,使用dotnet build -r linux-arm 构建,将二进制文件复制到我的Raspberry Pi,我可以在ARM CPU 上运行这个程序,包括nlog。
我尝试使用 Nuget 为 x64 平台加载 NLog,但总是只获得 x32。这是否意味着,NLog 在 repo 中没有 x64 版本的 NuGet 包?
我不知道您是如何得出 NLog 或其他软件包仅为 32 位的结论的。我建议你阅读 StackOverflow 关于如何创建 minimal, reproducable examples 的建议。当我这样做时,我经常自己找到问题的解决方案。当我自己找不到解决方案时,我有一个小而简单的示例,其他人可以在自己的机器上运行以验证意外行为,并可以帮助修改它以回答我提出的问题。无论如何,我无法重现您遇到的问题,我希望我的回答让您确信 .NET 库(为 AnyCPU 编译)可以在任何指令集上运行。