Deploying to a Raspberry Pi / 部署到树莓派
从 5.0 版本(英文)起,你可以把控制台应用导出到 Linux —— 这让树莓派成了一个绝佳的目标平台。
在应用导出器里这样指定:
- Output type:Console Application
- Target:Linux
部署模式
正如 Deploy .NET apps on ARM single-board computers(英文)所述,有两种部署模式:
依赖框架
导出器默认用这个模式。导出的东西要能跑起来,先得在树莓派上装好 .NET(英文),照做第 1、2 步。
导出成功后,把生成的文件复制到树莓派上,在那边的命令行里敲这个来运行程序:
dotnet myprogram.dll
自包含
用这个选项就不需要你装 .NET 了!
先正常跑一次导出,然后按 “Show Details” 按钮。最顶上你会看到这样一行:
dotnet publish -c Release --self-contained false /clp:ErrorsOnly /nologo PathToYourProject.csproj"
把它复制下来,打开一个命令提示符,按下面这样改过之后运行:
dotnet publish -c Release -r linux-arm --self-contained true /clp:ErrorsOnly /nologo PathToYourProject.csproj"
32 位的 Raspberry Pi OS 用 -r linux-arm,64 位版本用 -r linux-arm64。
导出成功后,把生成的文件复制到树莓派上,在那边的命令行里给可执行文件加上执行权限:
chmod +x myprogram
然后运行它:
./myprogram
自动部署文件
每次构建之后把文件复制到树莓派这件事,是可以自动化的。在导出器界面里按 Advanced build configuration,在 <Project> 标签内部加上下面这些行:
<PropertyGroup>
<SourceFolder>PATH-TO-YOUR-PROJECTS-EXPORT-FOLDER</SourceFolder>
<DestFolder>PATH-TO-YOUR-DESTINATION-FOLDER-ON-THE-PI</DestFolder>
</PropertyGroup>
<ItemGroup>
<FilesToCopy Include="$(SourceFolder)\**" />
</ItemGroup>
<Target Name="Deploy" AfterTargets="Publish">
<!-- copy all files from the source folder to the dest folder that are newer or don't exist in the dest folder -->
<Message Importance="High" Text="Copying files to Raspberry PI..." />
<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy->'$(DestFolder)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="True">
<Output TaskParameter="CopiedFiles" ItemName="Copied" />
</Copy>
<ItemGroup>
<OutdatedFiles Include="$(DestFolder)\**" Exclude="@(Copied)" />
</ItemGroup>
<Message Importance="High" Text="Deleting files..." />
<Delete Files="@(OutdatedFiles)" />
</Target>
把 SourceFolder 和 DestFolder 填好。之后每次构建,改动过的文件都会被复制到树莓派上。
开机自启
要让应用在树莓派开机时自动启动,得把它装成一个服务 —— rc.local、.desktop 文件这些办法似乎都不行。
安装服务的方法,参阅 boot.pdf 的第 “4.4 Using A Systemd Service” 章。
几个坑
- 如果你的程序要访问文件,记得把
WorkingDirectory设到应用在磁盘上所在的位置 ExecStart里 “dotnet” 和你的应用都需要写绝对路径,比如:/home/pi/.dotnet/dotnet /home/pi/MyApp/myapp.dll
把树莓派映射成网络驱动器
要把树莓派用户的主目录映射成 Windows 机器上的 Z 盘,在命令提示符里运行:
net use Z: \\[hostname]\[username]
好用的 NuGet
- System.Device.Gpio:用于 GPIO、I2C、SPI、PWM、串口
- Iot.Device.Bindings:用于更高层的特定设备支持
- VL.IO.RCP:用于从网页浏览器远程控制应用的参数
- IO 目录下的任何节点库
- SFML.Net:用于音频播放和录制(注意:这个 NuGet 的 2.5.0 版本录音是坏的,自己从源码编译才能用)
上游把「IO 目录下的任何节点库」链到 ../libraries/io.md,但上游仓库里并没有这个文件,链接是断的,因此译文这里不加链接。