0

0

.NET9 Linux AOT Json序列化

爱谁谁

爱谁谁

发布时间:2025-04-17 13:52:11

|

290人浏览过

|

来源于php中文网

原创

.net9 linux aot json序列化

  1. 简要记录在Linux(Ubuntu)操作系统上发布AOT程序时,发现System.Text.Json组件在Json序列化时抛出异常的处理步骤。

  2. 在 .NET 6 及更高版本中,可以使用 Ahead-of-Time (AOT) 编译来优化应用程序的启动时间和性能。AOT 编译通过 .NET Native AOT 实现,适用于需要快速启动和小型部署的场景。要使用 AOT 编译,需要在项目文件中进行配置,并使用命令行工具进行发布。以下是一个配置和发布 AOT 的简单步骤示例:


  
    Exe
    net9.0
    true
  

发布命令:

dotnet publish -c Release -r linux-x64 --self-contained

问题1,不同操作系统:如果你是首次发布,可能会遇到以下问题:

error : Cross-OS native compilation is not supported.

该错误消息表明你正在尝试在与目标操作系统不同的环境中进行原生编译(AOT)。简单来说,你可能是在 Windows 或 macOS 上尝试为 Linux 进行 AOT 编译,而这种跨操作系统的编译是不被支持的。因此,最简单的解决办法是将代码复制到 Ubuntu 然后再进行编译。

问题2,缺少环境:当我们将代码复制到 Ubuntu 操作系统上后,再次执行发布命令进行编译(可以使用 VS Code 或 Rider)时,会遇到以下问题:

/home/justerzhu/.nuget/packages/microsoft.dotnet.ilcompiler/8.0.10/build/Microsoft.NETCore.Native.Unix.targets(209,5): error : Platform linker ('clang' or 'gcc') not found in PATH. Ensure you have all the required prerequisites documented at https://aka.ms/nativeaot-prerequisites. [/home/justerzhu/Documents/code/client/GeneralUpdate.Client/GeneralUpdate.Client.csproj]

该错误消息表明在你的 Linux 环境中没有找到平台链接器(clanggcc)。在使用 .NET 的 AOT 编译时,需要使用这些工具来处理本机代码的链接。解决这个问题的步骤如下:

安装必要的工具:你需要确保在 Linux 系统上安装了 clanggcc。以下是如何在常见的 Linux 发行版上安装这些工具的步骤:

Ubuntu 更新软件包列表:

sudo apt update

安装 clanggcc

sudo apt install clang gcc

确保 clanggcc 在你的 PATH 中:

安装完成后,通常它们会自动添加到 PATH 中。可以通过以下命令检查:

clang --version
gcc --version

如果这些命令返回版本信息,则说明安装成功。

检查链接器:确保你的环境能够正确找到链接器。在终端中运行以下命令以确认:

which clang
which gcc

如果这两个命令中的任意一个返回路径,则说明链接器已正确安装并在 PATH 中。

问题3,缺少环境的问题再次来袭:当我们满怀信心再次执行发布命令时,突然又出现了问题:

error : linker command failed with exit code 1 (use -v to see invocation) [/home/justerzhu/Documents/code/client/GeneralUpdate.Client/GeneralUpdate.Client.csproj]
/home/justerzhu/.nuget/packages/microsoft.dotnet.ilcompiler/8.0.10/build/Microsoft.NETCore.Native.targets(366,5): error MSB3073: The command ""clang" "obj/Release/net8.0/linux-x64/native/GeneralUpdate.Client.o" -o "bin/Release/net8.0/linux-x64/native/GeneralUpdate.Client" -Wl,--version-script=obj/Release/net8.0/linux-x64/native/GeneralUpdate.Client.exports -Wl,--export-dynamic -gz=zlib -fuse-ld=bfd /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/sdk/libbootstrapper.o /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/sdk/libRuntime.WorkstationGC.a /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/sdk/libeventpipe-disabled.a /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/sdk/libstdc++compat.a /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/framework/libSystem.Native.a /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/framework/libSystem.Globalization.Native.a /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/framework/libSystem.IO.Compression.Native.a /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/framework/libSystem.Net.Security.Native.a /home/justerzhu/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.10/framework/libSystem.Security.Cryptography.Native.OpenSsl.a -g -Wl,-rpath,'$ORIGIN' -Wl,--build-id=sha1 -Wl,--as-needed -pthread -ldl -lz -lrt -lm -pie -Wl,-pie -Wl,-z,relro -Wl,-z,now -Wl,--eh-frame-hdr -Wl,--discard-all -Wl,--gc-sections" exited with code 1. [/home/justerzhu/Documents/code/client/GeneralUpdate.Client/GeneralUpdate.Client.csproj]

该错误表明在链接阶段出现了问题,导致 clang 链接器命令失败并返回了非零退出代码。要解决这个问题,我们需要进一步分析错误原因。以下是一些可能的原因和解决方案:

检查依赖库:缺少依赖库:

JSON.NET 简单的使用 中文WORD版
JSON.NET 简单的使用 中文WORD版

本文档主要讲述的是JSON.NET 简单的使用;JSON.NET使用来将.NET中的对象转换为JSON字符串(序列化),或者将JSON字符串转换为.NET中已有类型的对象(反序列化?)。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

确保你已经安装了所有必需的开发库。特别是对于 Linux 上的 AOT 编译,可能需要一些额外的库,例如 libc-devlibz-devlibssl-dev 等。你可以通过以下命令安装常用的开发库:

sudo apt install build-essential zlib1g-dev libssl-dev

链接器选项问题:

有时错误可能是由于链接器选项不兼容或不正确。检查项目文件或构建配置中是否有自定义的链接器选项,确保它们是正确的。

增加详细输出:增加编译过程的详细输出可以帮助你了解问题的细节:

dotnet publish -c Release -r linux-x64 --self-contained -v diag

-v diag 会输出详细的诊断信息,可以帮助你找到更具体的错误原因。

检查代码中使用的库:如果你的项目中使用了某些特定的 C++ 或本地库,确保它们的头文件和库文件在 Linux 环境中是可用且兼容的。

验证 Native AOT 的支持:确认使用的 .NET Native AOT 工具链版本是正确的,并且你的项目和依赖项支持 AOT 编译。某些第三方库或特性可能不支持 AOT 编译。

使用最新的工具链:确保使用的是最新版本的 .NET SDK 和工具链。你可以通过以下命令更新你的 .NET SDK:

sudo apt update
sudo apt install dotnet-sdk-8.0

问题4,版本不一致:在 Linux 发布之前我安装了 .NET 8 的运行环境,但是我项目里应用的是 .NET 9 的 NuGet,这时候就导致了无法正常发布 AOT。所以这里也是提醒各位发布之前注意版本对齐。

System.MissingMethodException: Method not found: 'Void System.Text.Json.Serialization.Metadata.JsonObjectInfoValues1.set_ConstructorAttributeProviderFactory(System.Func1)'.at Internal.Runtime.TypeLoaderExceptionHelper.CreateMissingMethodException(ExceptionStringID, String) + 0x47at Internal.Runtime.CompilerHelpers.ThrowHelpers.ThrowMissingMethodException(ExceptionStringID, String) + 0x6at GeneralUpdate.Common.AOT.JsonContext.VersionRespJsonContext.Create_VersionRespDTO(JsonSerializerOptions) + 0x12at System.Text.Json.JsonSerializerOptions.GetTypeInfoNoCaching(Type) + 0x43at System.Text.Json.JsonSerializerOptions.CachingContext.CreateCacheEntry(Type type, JsonSerializerOptions.CachingContext context) + 0x1e--- End of stack trace from previous location ---at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + 0x1cat System.Text.Json.JsonSerializerOptions.CachingContext.CacheEntry.GetResult() + 0x1bat System.Text.Json.JsonSerializerOptions.GetTypeInfoInternal(Type, Boolean, Nullable`1, Boolean, Boolean) + 0x44at System.Text.Json.JsonSerializerOptions.GetTypeInfo(Type) + 0x49at GeneralUpdate.Common.AOT.JsonContext.VersionRespJsonContext.get_VersionRespDTO() + 0x39at GeneralUpdate.Common.Shared.Service.VersionService.d__2.MoveNext() + 0x114--- End of stack trace from previous location ---at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + 0x1cat System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task) + 0xbeat System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task, ConfigureAwaitOptions) + 0x4eat GeneralUpdate.ClientCore.GeneralClientBootstrap.d__13.MoveNext() + 0x109

这个时候只能在电脑上把 NuGet 的版本一个个对齐或者安装对应 .NET 的版本即可。

问题5,Json序列化怎么转都报错:具体的报错我没有记录,但是不处理 Json 序列化一定会报错。下面这段代码在非 AOT 发布的情况下是可以正常使用的,但在 AOT 发布时存在问题(原因在参考资料中了解)。

var jsonStr = JsonSerializer.Serialize(parameters);

参考资料:

https://www.php.cn/link/ba9d98e8e54041173ea4f3640ed79cachttps://www.php.cn/link/26c7cc8d05a0dc19cfc07baa975877f1

这时候只能找找参考资料,看完一遍之后大致写法如下:

class Packet
{
    [JsonPropertyName("Name")]
    public string? Name { get; set; }
    [JsonPropertyName("Hash")]
    public string Hash { get; set; }
//....

}

[JsonSerializable(typeof(Packet))] public partial class PacketJsonContext : JsonSerializerContext;

var jsonStr = JsonSerializer.Serialize(parameters, PacketJsonContext.Default.Packet);

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

420

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

536

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

312

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.12.06

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

223

2023.12.07

JavaScript中的typeof用法
JavaScript中的typeof用法

在JavaScript中,typeof是一个用来确定给定变量的数据类型的操作符。可以用来确定一个变量是字符串、数字、布尔值、函数、对象或undefined的数据类型。更多关于typeof用法相关文章,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

752

2023.11.23

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 2.4万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号