树莓派无法运行自包含.NET 6应用:提示‘无此文件或目录’
问题:自包含.NET 6控制台应用部署到树莓派后无法执行
按照微软官方文档将.NET 6控制台应用部署为自包含应用到树莓派,执行步骤时遇到问题。
部署完成后在树莓派终端执行以下命令:
pi@babyminder:~/babyminder $ chmod +x PoC.BabyMinder.Gpio pi@babyminder:~/babyminder $ ls -l total 18668 -rw-r--r-- 1 pi pi 9824 Jul 19 23:09 libSystem.IO.Ports.Native.so -rwxr-xr-x 1 pi pi 19089322 Jul 19 23:09 PoC.BabyMinder.Gpio -rw-r--r-- 1 pi pi 10892 Jul 19 23:09 PoC.BabyMinder.Gpio.pdb pi@babyminder:~/babyminder $ ./PoC.BabyMinder.Gpio -bash: ./PoC.BabyMinder.Gpio: No such file or directory
发布配置文件(pubxml)内容:
<?xml version="1.0" encoding="utf-8"?> <!-- https://go.microsoft.com/fwlink/?LinkID=208121. --> <Project> <PropertyGroup> <Configuration>Release</Configuration> <Platform>Any CPU</Platform> <PublishDir>bin\Release\net6.0\publish\linux-arm\</PublishDir> <PublishProtocol>FileSystem</PublishProtocol> <TargetFramework>net6.0</TargetFramework> <RuntimeIdentifier>linux-arm</RuntimeIdentifier> <SelfContained>true</SelfContained> <PublishSingleFile>true</PublishSingleFile> <PublishTrimmed>true</PublishTrimmed> </PropertyGroup> </Project>
用于上传文件的scp命令:
scp -r bin/Release/net6.0/publish/linux-arm/* pi@babyminder:/home/pi/babyminder/
补充信息:
- 仅掌握基础Unix知识
- 树莓派安装的是全新64位Raspberry Pi OS Lite
- 使用
chmod 777权限仍无法解决问题 - 省略
chmod命令时,执行提示“-bash: ./PoC.BabyMinder.Gpio: Permission denied”(确认文件确实存在) - 部署框架依赖型应用可正常运行
解决方案
核心问题是运行时标识符(RuntimeIdentifier)与树莓派系统架构不匹配:你的树莓派是64位系统,但发布时指定了linux-arm(32位ARM架构),生成的二进制文件无法在64位系统上加载,系统抛出的“文件不存在”是加载器的误导性提示,实际是架构不兼容导致的依赖缺失。
解决步骤:
- 修改pubxml中的
<RuntimeIdentifier>值为linux-arm64:
<RuntimeIdentifier>linux-arm64</RuntimeIdentifier>
- 重新发布应用:在Visual Studio中右键项目选择“发布”,或使用命令行执行:
dotnet publish -c Release -r linux-arm64 --self-contained true
- 重新上传发布后的文件到树莓派:
scp -r bin/Release/net6.0/publish/linux-arm64/* pi@babyminder:/home/pi/babyminder/
- 再次设置执行权限并运行:
chmod +x PoC.BabyMinder.Gpio ./PoC.BabyMinder.Gpio
说明:64位Raspberry Pi OS需要对应64位的ARM编译产物,linux-arm针对32位ARM设备,两者架构不兼容导致加载失败。框架依赖型应用能运行,是因为树莓派上安装的.NET运行时是64位版本,可自动适配系统架构。
内容的提问来源于stack exchange,提问作者fharreau
相关产品推荐
相关产品推荐

