【问题标题】:Nuget NLog 64bitNuget NLog 64 位
【发布时间】:2020-09-17 11:51:47
【问题描述】:

我有一个使用 NLog 的 asp.net 应用程序。我可以成功地在 x32 平台上运行它。但是对于 x64 平台,我在启动时遇到错误:

BadImageFormatException 无法加载文件或程序集或其依赖项之一。试图加载格式不正确的程序

我认为,这是由于加载了 Nuget 的 x32 版本的 NLog.dll。我尝试使用 Nuget 为 x64 平台加载 NLog,但总是只获得 x32。这是否意味着,NLog 在 repo 中没有 x64 版本的 NuGet 包? NLog 只是一个例子。我的应用程序依赖于 NJsonSchema.dll、System.Web.Razor.dll 等许多其他包。但是他们都在 Nuget 仓库中只有 x32 版本,为什么?明明是MS的系统包,为什么没有x64版本? 这是否意味着我应该只构建我的 asp.net 应用程序的 x32 平台?

【问题讨论】:

    标签: nuget badimageformatexception


    【解决方案1】:

    我想,是因为 x32 版本的 NLog.dll,加载了 Nuget。

    好的,让我们尝试验证这个假设。首先,我使用dotnet new console 创建了一个新项目,然后我构建了几次,dotnet builddotnet build -r win-x86dotnet 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 rundotnet run -r win-x86dotnet 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 编译)可以在任何指令集上运行。

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 1970-01-01
      • 2021-08-28
      • 2011-12-07
      • 1970-01-01
      • 2018-02-21
      • 2019-07-09
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多