(Raspbian + C# + Mono) 'System.Device.Gpio.Drivers.LibGpiodDriver' 的类型初始值设定项抛出异常

(Raspbian + C# + Mono) Type initializer for 'System.Device.Gpio.Drivers.LibGpiodDriver' threw an exception

我正在为一个新项目进行初步研究。我已经购买了 Raspberry Pi 3B,我正在尝试 运行 一个小程序来检查我们所有的必需品:

  1. SQL 服务器连接。
  2. 将配置文件保存在磁盘上。
  3. 在 Raspberry GPIO 中配置和使用一些 DI/DO。

到目前为止,我已经在其上安装了 Mono 库,并且在我的 windows 机器上使用 Visual Studio 2019 来构建 WinForms 应用程序。

Raspberry OS version: Raspbian GNU/Linux 10 (buster)
Mono version        : Mono JIT compiler version 6.12.0.122

这些是我的应用程序包:(.Net Framework 4.8)

<packages>
  <package id="Microsoft.Win32.Registry" version="5.0.0" targetFramework="net48" />
  <package id="System.Buffers" version="4.5.1" targetFramework="net48" />
  <package id="System.Device.Gpio" version="1.5.0" targetFramework="net48" />
  <package id="System.Memory" version="4.5.4" targetFramework="net48" />
  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
  <package id="System.Runtime.InteropServices.WindowsRuntime" version="4.3.0" targetFramework="net48" />
  <package id="System.Runtime.WindowsRuntime" version="4.6.0" targetFramework="net48" />
  <package id="System.Security.AccessControl" version="5.0.0" targetFramework="net48" />
  <package id="System.Security.Principal.Windows" version="5.0.0" targetFramework="net48" />
  <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
</packages>

到目前为止,我还没有连接到 GPIO,我只是想使用以下代码读取引脚值:

private void ReadPinTest()
{
    int pin = 24;
    PinValue pinValue = PinValue.Low;

    try
    {
        using (GpioController gpio = new GpioController(PinNumberingScheme.Board))
        {
            if (gpio == null)
            {
                MessageBox.Show("No GPIO controller found.");
                return;
            }

            gpio.OpenPin(pin, PinMode.Input);
            pinValue = gpio.Read(pin);
        }

        MessageBox.Show($"Pin {pin} is {pinValue}");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        MessageBox.Show(ex.InnerException.Message);
        MessageBox.Show(ex.InnerException.StackTrace);
    }
}

我遇到了下一个错误:

异常信息:

Type initializer for 'System.Device.Gpio.Drivers.LibGpiodDriver' threw an exception.

InnerException 消息:

libgpiod

InnerException StackTrace:

at(wrapper managed - to - native) Interop + libgpiod.gpiod_version_string()
at System.Device.Gpio.Drivers.LibGpiodDriver.IsLibgpiodVersion1_5orHigher() [0x00000] in < d49ca6cd97194f038905958dbca2c58c >:0
at System.Device.Gpio.Drivers.LibGpiodDriver..cctor ()[0x0000f] in :0

我尝试重新安装 gpiod 库:

sudo apt-get install gpiod

gpiod is already the newest version (1.2-3+rpi1).

我做错了什么?

WinForms 仅设计用于 Windows 上的 运行。它可能适用于 Mono,但您可能希望在 Windows 机器上编译它。到目前为止,Mono 似乎支持 .NET Framework 4.7 — 所以这可能是消息的来源。

如果您不想在 Windows 上编译,请尝试以 4.7 为目标或使用 dotnet core 并编写命令行应用程序来测试您的后端要求。

我建议在定位 linux/raspbian 时使用 .NET 5.0。对 linux 的支持在这个版本中有了很大的改进,而 Mono 的未来是不确定的。它还没有正式的 Gui 支持,但您可以使用 Avalonia 或尝试 Maui-Linux 包,它最终将进入 .NET 6.0(计划于今年秋天)。

您的特定问题可能已由 运行

解决
sudo apt install -y libgpiod-dev

但是,System.Device.Gpio 尚未针对单声道进行深入测试,因为它主要针对 .NET Core。 .NET Framework 支持 Windows.