我最近有一个Raspberry Pi(3B +和4),并且一直在尝试使用System.Device.Gpio软件包来使.Net Core应用程序正常工作,并紧随a post on Scott Hanselman's blog之后。我正在从我的开发机上发布文件,然后将文件scp'到pi。
如果我使用dotnet publish -r linux-arm
进行SCD(自包含部署)并将许多文件复制到Pi,我可以运行该应用程序,并且LED会按预期闪烁。
但是,我尝试做一个dotnet publish
来创建FDD(框架依赖部署),但是将这些文件复制过来并执行dotnet ./BlinkLed.dll
会导致System.PlatformNotSupportedException
被抛出new GpioController(PinNumberingScheme.Board)
。
我的理解是,FDD和SCD之间的唯一区别是,前者需要安装.Net Core运行时,我看不到关于某些仅在documentation中运行于SCD的应用程序的任何提及。我已经在Pi上安装了它,并且可以dotnet ./<SomeDll>
用于打印到控制台的简单hello world应用程序,如果我尝试使用System.Device.Gpio
软件包,它似乎不起作用。在尝试建立良好的远程调试体验时,如果能够执行FDD会比较理想,因为FDD生成的文件要少得多,这意味着每个发布/调试周期可以复制到Pi的内容更少。
Program.cs
看起来像这样:
using System;
using System.Device.Gpio;
using System.Threading;
namespace LedBlink
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello LedBlink!");
using(var gpioController = new GpioController(PinNumberingScheme.Board)) // <-- This is where the exception is thrown
{
var pin = 11;
gpioController.OpenPin(pin, PinMode.Output);
try
{
for (var i = 0; i < 3; i++)
{
gpioController.Write(pin, PinValue.High);
Thread.Sleep(500);
gpioController.Write(pin, PinValue.Low);
Thread.Sleep(500);
}
}
finally
{
gpioController.ClosePin(pin);
}
}
}
}
}
总而言之,如果我执行自包含部署,则我的应用程序可以运行,但是如果我进行框架相关的部署,则我的应用程序可以工作,并且我想进行框架相关的部署。