如何在 dotnet 核心的 raspberri pi 中部署示例 GRPC [客户端-服务器] 解决方案

Aji*_*jpe 2 raspbian .net-core grpc

我正在尝试在运行 Raspbian os 的 raspberri Pi 中运行一个简单的 GRPC 客户端-服务器代码。

我使用的语言 -C# dotnet core (2.1)

我从这里下载了一个示例项目。

这是一个 dotnet 核心项目。我能够在 Windows 环境中运行它,我也能够在此代码中修改 .proto 文件并成功运行。

我用命令发布了解决方案

{ dotnet publish -r linux-arm }
Run Code Online (Sandbox Code Playgroud)

当尝试在 Rpi 上运行相同的程序时,我遇到了异常。附带的截图有它的详细信息。错误.png

任何帮助解决这个问题都会很有用

Eri*_*est 6

tl;dr问题是 libgrpc_csharp_ext 本机库,目前没有为 arm7 处理器编译和构建。我已经为 arm7 编译了它(在 pi 上)并发布了一个 nuget 包来弥合差距,直到他们一直支持它:https ://www.nuget.org/packages/libgrpc_csharp_ext.arm7/

当我完成我正在处理的其余工具和模板时,我会更新一个指向博客文章的链接。

更完整的解释:Grpc.Core nuget 包包含本地 libgrpc_csharp_ext 库,grpc 的 dotnet 实现加载在NativeExtensions.cs 中,然后与NativeMethods.Generated.cs 中的PInvoke 映射。检查该包,您将在每个 /runtimes/[win, osx, linux]/native 文件夹中看到该库的一个版本。不幸的是,没有包含该库的 linux-arm 版本。但是,在代码中,如果平台是linux,它会尝试使用此处格式化的名称加载静态库. 稍微剖析一下,你会看到,到目前为止,任何不是“64位”的“linux”平台(尽管 pi 上的 proc 是 64 位的,但你在那里使用的 linux 发行版,包括 raspbian,可能不是)会寻找 libgrpc_csharp_ext.x86.so。当你dotnet publish -r linux-arm,你会在构建输出中看到那个库,但不幸的是,它是错误的(我认为当它在运行时文件夹中找不到特定的库时,发布只是抓取“最接近的”)。

我在上面创建的 nuget 包是为 arm7 编译的——我实际上是将 grpc 存储库克隆到一个 pi 上,并剥离了足够的 /csharp 构建,以便仅创建 libgrpc_csharp_ext。包使用的“技巧”是将库放在包内的 runtimes/linux-arm/native 文件夹中,dotnet 核心在发布时识别并拉入构建输出 - 但该库仍命名为 libgrpc_csharp_ext.x86.so,因为NativeMethods.cs 格式化库名称的方式。