树莓派4 Linux开机自启dotnet dll报访问拒绝错误如何解决?
故障根因与解决方法
你不需要在Linux环境重新编译源码,.NET生成的跨平台IL指令集兼容不同操作系统,你在终端直接执行命令可正常运行就已经证明dll本身没有兼容性问题。
从你提供的错误堆栈可以直接定位故障点:程序代码GreetingService.cs第220行调用了Console.ReadLine()方法。rc.local、systemd等开机自启场景下,后台进程未关联交互式终端,标准输入流默认处于关闭状态,此时读取控制台输入的操作就会触发Bad file descriptor异常,最终导致进程崩溃退出。
解决方案
方案1:修改代码(永久生效,推荐)
- 删除后台服务不需要的
Console.ReadLine()调试逻辑即可,服务本身是循环上报数据的常驻进程,不需要等待控制台输入来维持运行 - 如果需要保留本地调试时的控制台等待逻辑,可以增加输入重定向判断,只在交互式终端运行时触发等待:
// 仅当标准输入未被重定向(交互式运行场景)时等待控制台输入 if (!Console.IsInputRedirected) { Console.ReadLine(); }
- 重新编译后替换树莓派上的dll文件即可。
方案2:修改启动配置(无需改代码,临时适配)
如果暂时无法修改源码,可以在启动时给进程重定向标准输入流,避免读取报错:
- rc.local启动命令修改为:
dotnet /home/pi/E6101/AV308XC/AV308XC.dll < /dev/null & - systemd服务配置的
[Service]段添加如下配置:
StandardInput=null
额外注意:确保运行该.NET进程的用户拥有串口设备
/dev/ttyUSB0的访问权限,可执行sudo usermod -aG dialout 运行用户名将用户加入串口权限组,避免后续出现串口访问拒绝问题。
内容的提问来源于stack exchange,提问作者서상원
相关产品推荐
相关产品推荐

