在树莓派上轻松设置 .NET Core 并使用 VS Code 进行远程调试





5.00/5 (9投票s)
为 .NET Core 开发和使用 Visual Studio Code 进行远程调试自动化设置树莓派
引言
在手动为 .NET core 和远程调试设置树莓派之后,我想要一个更简单、更自动化的解决方案。这样做的好处是它会:
- 更简单,更省时间
- 减少出错
- 更容易跟上 Raspbian 的新版本
- 无头模式 - 即无需显示器、键盘或鼠标。
背景
有很多其他文章涵盖了这个主题,对我来说最有用的大概是 Scott Hanselman 的这篇文章。然而,它们都要求进行大量的手动设置。我想要一个尽可能自动化的解决方案。显然,需要一些手动干预,因为你必须物理移动 SD 卡、给设备通电等,但除此之外,我的目标是运行一个脚本,然后设置就会自动完成。正如 Scott Hanselman 所说:
引用一个好的(有点开玩笑,但并非完全如此)程序员经验法则——如果你做一件事超过两次,就把它自动化。
我希望设置能实现以下目标:
- 从开发机器上格式化好的新 SD 卡开始
- 配置卡片,使其在转移到树莓派时允许远程 SSH
- 为树莓派配置安全的无密码 SSH 连接
- 安装 .NET Core 和 VS 远程调试器
最后,我会添加几个 C# 项目来演示所有这些是如何工作的。
工具选择
我使用 VS Code 几年了,非常喜欢它——所以这就是我决定使用的(我还使用过各种版本的 Visual Studio 几十年了——但我不会在这里深入讨论它们的优缺点。:))
我也非常喜欢 Powershell,但决定使用 Bash 来编写脚本。这样希望能尽可能实现跨平台。你需要将 VS Code 配置为默认使用 bash shell——最简单的方法是按 Ctrl+Shift+P 并输入 `default shell`。这将提供命令提示符、Powershell 或各种 Linux 版本的选项。最适合我的是 Git Bash,但其他版本也应该可以工作。
必备组件
VS Code 解决方案可以复制到开发机器的任何位置。在 Visual Studio Code 中打开它时,请使用 文件 菜单中的 打开文件夹。
你需要一种将 Raspbian 镜像写入 SD 卡的方法。我推荐使用 树莓派映像写入器 (Raspberry Pi Imager)。你不必先下载镜像,但我认为这样做是值得的,因为否则你可能会发现自己使用了大量的互联网带宽(即使压缩后,镜像通常也达到数 GB)。已下载的镜像可以通过镜像列表上的 使用自定义 选项访问。
你需要一个无线路由器,并且需要知道 SSID 和 PSK。我假设你拥有这些信息 :)。当然,还需要一个树莓派和电源。我在树莓派 3 上测试过,但 V2 及以上版本应该都可以。请注意,这不适用于树莓派 Zero,因为它使用的是 ARMV6,而 .NET core (遗憾地) 不支持该架构。如果你的树莓派没有内置 Wi-Fi,你还需要一个 USB Wi-Fi 网卡。
最后,你需要下载最新版本的 .NET Core SDK。撰写本文时,版本是 3.1。这应该复制到 PiFiles 文件夹。你需要 ARM32 版本,并且预计它的大小会超过 100MB。
准备 SD 卡
一旦你有一个全新刷写的 SD 卡,在将其插入树莓派之前,它需要一些额外的配置。这是任务 1 和 2。要运行任务,请按 Ctrl+Shift+P 并选择 Tasks: Run Task。你应该会看到一个任务列表,如下所示:
选择任务 1. 设置 Wi-Fi 设置... 这将询问你的 Wi-Fi SSID 和 PSK。当你输入这些信息后,它们将存储在 settings.json 中,这样你就不必再次输入。
然后选择任务 2. 修改 SD 卡以进行 SSH 访问... 这将询问你包含 SD 卡的驱动器。因为这将在 bash 脚本中访问,所以它很可能是类似 /d 或 /mnt/d 的路径。如果你刚刚制作了镜像卡,可能需要重新插入,因为镜像程序完成后会弹出它。运行任务 2 后,你应该弹出卡并将其插入树莓派。给树莓派通电并等待它启动,然后进行下一步。
SSH 配置和 .NET 安装
下一步是运行任务 3. 设置树莓派名称。这将把主机名从默认的 raspberrypi 更改为你选择的名称。你还会被问到是否要设置静态 IP 地址。如果你不想要静态 IP,请留空。我使用 Windows 10 和本地主机名查找 (mDNS) 的经验一直断断续续——我不确定它是否像它应该的那样可靠。然而,即使你根本无法使本地名称解析工作,你也应该能够使用 IP 地址代替。和以前一样,这些设置会保存在 settings.json 中,所以你不必重新输入它们。
设置新名称后,任务 4. 将公共 SSH 密钥添加到树莓派 将重新配置树莓派并将公共 ssh 密钥复制到其中,这样当你(或 VS 工具)通过 ssh 连接时就不必输入密码。系统会询问你是否要连接(输入 yes
),然后询问树莓派密码(输入 raspberry
)。此时,树莓派将重新启动,因此你需要等待,然后才能运行下一步。如果你还没有设置 ssh 密钥,像这样的文章会告诉你如何创建一个。现在你将能够无需输入密码即可登录,但仅限于你的机器。
任务 5. Raspberry Pi Dotnet 安装 将在 Raspberry Pi 上安装 .NET core SDK 和 VS 调试器。这将需要一些时间,但一旦完成,我们现在就可以在 Raspberry Pi 本身或远程在我们的主开发机器上编写 .NET 程序了——显然远程会更有趣!
示例程序
我创建了两个示例程序。第一个是 Hello World 项目。它将同时在本地(即开发机器上)和远程运行。运行它的最简单方法是选择左侧的 运行 图标,然后从下拉列表中选择配置。
现在你应该能够像在本地一样设置断点和调试了。
要运行闪烁程序,你需要将一个 LED 连接到其中一个 GPIO 引脚。闪烁程序使用出色的 System.Device.Gpio 库,该库应该会通过 NuGet 自动安装。
在下一篇文章中,我将展示如何创建一个更大、更真实的解决方案,包括单元测试、依赖注入和模拟。该文章可以在这里找到:
关注点
好了,这篇文章就到这里。用 Python 编写闪烁程序可能会简单得多,但对我来说,使用 C# 的全部意义在于,你可以用 .NET 创建更大、更易于维护的解决方案(尽管我确信有些人会不同意这一点)。话虽如此,本文中的演示程序并非旨在作为大型程序的模板。我写了另一篇文章(见上文),其中阐述了我认为是一个好的结构,包括一个用于 GPIO 接口的库(仍然使用 System.Device.Gpio)和一个单元测试项目。我已经研究出如何使用 Moq 和依赖注入来模拟 Gpio 调用。我认为也应该可以创建一个自定义的 Gpio.Device
并制作一个模拟器,但这将不得不等到第三篇文章了……
历史
- 2020年5月1日:首次发布
- 2020年5月7日:小幅更新
- 2020年5月25日:添加对第 2 部分的引用