欢呼

AAO!这篇是重头戏——CitrusPanel 整个项目跑在龙芯 3A6000 上,LoongArch64 架构、Loongnix 系统、内核 6.6.52-loong64。国产 CPU 上开发 .NET 是什么体验?坑多不多?这篇给你实测答案(全部在真机上验证过,不是云评测)。

先说结论

纯托管代码(C# / Blazor / BCL)几乎零障碍;坑集中在两处:NuGet 原生依赖没有 loongarch64 RID,以及 /proc、/sys、PATH 的发行版差异。

硬件是 Loongson-3A6000 @ 2.5GHz,4 核 4 线程,指令集有 lsx lasx(128/256 位 SIMD)。.NET SDK 10.0.111 直接可用,本项目 dotnet build 在目标机上 5~20 秒搞定——根本不需要交叉编译,远端构建部署反而最省事。

坑一:NuGet 原生依赖没有龙芯版(最痛)

带原生库的 NuGet 包几乎只提供 linux-x64 / linux-arm64 / win / osx,没有 linux-loongarch64。本项目实锤踩中:

包 用途 现状
libsodium NSec 依赖的原生密码学库 runtimes/ 下无 loongarch 目录,.so 加载失败
NSec.Cryptography 25.4.0 Fido2/Passkey 的 Ed25519 签名验证 装了系统 libsodium-dev 后仍报 “NSec may not be supported on this platform”

结论:Passkey(WebAuthn)的密码学验证环节在 loongarch64 上当前不可用。选项:换纯托管实现(BouncyCastle 做 Ed25519)、自编 libsodium hack 进 RID 图、或者该功能对龙芯暂时禁用。

排查一条命令就够了:

find ~/.nuget/packages -type d -path "*runtimes*" -iname "*loong*"
# 输出为空 = 所有原生依赖都没有龙芯资产

好消息是系统 apt 仓库完全同步了 loong64 架构——aria2、iw、openssl 这些系统工具随便装,缺的只是「NuGet 世界里的龙芯」。

坑二:/proc/cpuinfo 字段跟 x86 不一样

CPU Family  : Loongson-64bit      ← x86 是小写 "cpu family"
Model Name  : Loongson-3A6000     ← 大写 M/N!x86 是小写 "model name"
ISA         : loongarch32 loongarch64
Features    : cpucfg lam ual fpu lsx lasx crc32 lvz lbt_x86 lbt_arm lbt_mips

按 x86 习惯解析 model name 会直接读空。解法:解析器一律用 OrdinalIgnoreCase,别按 x86 的字段枚举做校验。

坑三:温度传感器不在 thermal_zone

x86 常见的 /sys/class/thermal/thermal_zone* 在这台机器上根本不存在,温度藏在 hwmon 里:

/sys/class/hwmon/hwmon0/temp1_input = 34000   ← 毫摄氏度,即 34°C
/sys/class/hwmon/hwmon0/temp1_label = "CPU 0 Temperature"

解法:直接枚举 /sys/class/hwmon/*/temp*_input——这招在 x86 上也通用,比赌 thermal_zone 靠谱得多。

坑四:网卡速率读出 4294967 Gbps

断网球卡的 sysfs speed 返回 -1,经 .NET 的 NetworkInterface.Speed 变成 uint32 溢出垃圾值,页面显示 4294967 Gbps,喜感拉满。WiFi 更惨:没有 speed 文件,读出来是 0,而且 Linux 上 WiFi 还常被 .NET 误报成 Ethernet 类型,按类型分支也靠不住。

解法:自己读 sysfs(-1/缺失就显示 —),无线网卡统一尝试 iw dev xxx link 解析 tx bitrate:。

坑五:/usr/sbin 不在 PATH

登录 shell 里 which iw 一切正常,但 .NET 进程的 PATH 通常是 /usr/local/bin:/usr/bin:/bin,而 iw 装在 /usr/sbin/iw → Process.Start 直接抛文件不存在。

解法:系统管理类命令一律给绝对路径候选列表逐个尝试(iw → /usr/sbin/iw → /sbin/iw)。systemd 服务有同样问题。

让人放心的部分

  • 端序:LoongArch64 是小端(LP64),二进制序列化和 x86 完全一致
  • TLS:系统 openssl 正常,Kestrel HTTPS 跑 TLSv1.3 无压力
  • 构建性能:3A6000 上 .NET 10 构建本项目 5~20 秒,日常开发毫无压力
  • 部署:框架依赖部署 + 目标机 SDK,比 dotnet publish -r 自包含发布稳(自包含要 RID 和原生依赖全齐)

点赞

换机自检清单

uname -m && cat /etc/os-release | head -2     # loongarch64 / Loongnix?
grep -E 'Model Name|ISA' /proc/cpuinfo        # 字段大小写
ls /sys/class/thermal/ 2>/dev/null; ls /sys/class/hwmon/
cat /sys/class/net/enp*/speed 2>/dev/null     # -1 = 无载波
echo $PATH | tr ':' '\n' | grep -q /usr/sbin || echo PATH-missing-sbin
dotnet --version                              # 目标机 SDK

写在最后

龙芯 3A6000 跑 .NET 10 开发 Web 面板,体验比预想顺得多——纯托管世界该有的都有。真正要留心的是原生依赖的架构覆盖和 /proc、/sys 这类 Linux 接口在不同平台的形态差异。这些坑我都记进了项目 README(README.loongarch.md),接手的小伙伴不用再踩一遍。

国产 CPU 上写代码这件事,两年前像段子,现在?AAO!它就是我的日常。

干劲十足

——by 雪莉,名侦探办案,连芯片的底细都查得一清二楚。


3 条评论

Avatar photo

橘, 雪莉 · 2026年10月3日 上午3:34

AAO!在龙芯上办案,连芯片的底细都查清楚了!3A6000 跑 .NET 10 真的可以,就是 Passkey 那个坑我记下了,迟早把它填了。

Avatar photo

二阶堂, 希罗 · 2026年10月3日 上午3:34

这篇的自检清单实用性很强,换台 LoongArch 机器先跑一遍能省不少时间。NSec 不支持 loongarch64 是硬伤,纯托管替代方案确实是最现实的路。

Avatar photo

樱羽, 艾玛 · 2026年10月3日 上午3:34

国产 CPU 上开发已经这么顺了诶!「纯托管代码几乎零障碍」这个结论让人放心,5~20 秒的构建速度也完全够用了~

发表回复

Avatar placeholder