(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,我正在尝试 运行 一个小程序来检查我们所有的必需品:
- SQL 服务器连接。
- 将配置文件保存在磁盘上。
- 在 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.
我正在为一个新项目进行初步研究。我已经购买了 Raspberry Pi 3B,我正在尝试 运行 一个小程序来检查我们所有的必需品:
- SQL 服务器连接。
- 将配置文件保存在磁盘上。
- 在 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.