使用为.NET 5编写的NuGet库的.NET 6控制台应用程序在Windows下运行良好,但在Mac M1上崩溃,出现



在Windows下,我使用了SaxonCS库(可在NuGet上获得https://www.nuget.org/packages/SaxonCS/它在.NET 5和.NET 6应用程序中都成功地针对.NET 5编写。

然而,现在在Mac M1上尝试我的一些.NET代码时,我发现在.NET 5应用程序中使用SaxonCS可以工作,而在.NET 6应用程序中尝试不会出现构建错误,但在尝试运行时会出现错误System.BadImageFormatException。

详细信息如下:

dotnet NET6ConsoleApp1.dll
Unhandled exception. System.BadImageFormatException: Could not load file or assembly 'SaxonCS, Version=11.2.0.0, Culture=neutral, PublicKeyToken=null'. An attempt was made to load a program with an incorrect format.
File name: 'SaxonCS, Version=11.2.0.0, Culture=neutral, PublicKeyToken=null'
zsh: abort      dotnet NET6ConsoleApp1.dll

所用.NET:的详细信息

dotnet --info
.NET SDK (gemäß "global.json"):
Version:   6.0.200
Commit:    4c30de7899
Laufzeitumgebung:
OS Name:     Mac OS X
OS Version:  11.6
OS Platform: Darwin
RID:         osx.11.0-arm64
Base Path:   /usr/local/share/dotnet/sdk/6.0.200/
Host (useful for support):
Version: 6.0.2
Commit:  839cdfb0ec
.NET SDKs installed:
6.0.200 [/usr/local/share/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 6.0.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.2 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

在C#代码方面,控制台应用程序只做

using Saxon.Api;
Console.WriteLine("{0} {1} {2}", Environment.Version, Environment.OSVersion, Environment.ProcessPath);
Environment.SetEnvironmentVariable("SAXON_LICENSE_DIR", "/Users/username/Library/SaxonCS");
Processor processor = new Processor(true);
Console.WriteLine("{0} {1}", processor.ProductTitle, processor.ProductVersion);

我不明白为什么代码在Windows和.NET 6下运行,但在Mac M1 ARM下失败。

有人能解释吗?如何在不等待或要求库所有者发布.NET6版本的情况下解决该问题?

Saxonica同时发布了SaxonCS 11.3,通过确保NuGet包包含一个独立于平台的/MSL库而不是Amd64目标库来解决问题。这样,我就可以在AMD 64机器以及像M1 mini这样的ARM 64机器上使用和运行该库。

故事的另一个令人困惑的部分是,在ARM 64/M1机器上的.NET 5运行时确实";消耗";在M1平台上,Windows编译的AMD 64库作为.NET 5只能通过兼容层(Rosetta?(工作。

了解.NET为目标体系结构编译程序集的方式很重要。

  • 如果您使用x64体系结构,它将为您正在编译的操作系统的x64二进制版本进行编译
  • 如果您使用Any CPU体系结构,则您的汇编将在中间二进制代码中编译,当您运行应用程序时,JIT(实时编译器(将为托管体系结构编译该代码

您必须使用特定的目标体系结构,以防您使用特定于体系结构的第三方库或使用本机库(如C++库(。

在所有其他情况下,您应该使用AnyCPU,并让JIT为您完成工作。为了在你的小测试项目中证明这一点,只需使用任何CPU配置编译你的.NET5库,一切都会得到修复。

很明显,Saxonica没有发布架构图书馆的独立版本。所以你不能自己解决这个问题。

相关内容

最新更新