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

时间:2019-02-07 07:28:32

标签: .net-core raspbian grpc

我试图在运行Raspbian操作系统的raspberri Pi中运行简单的GRPC客户端-服务器代码。

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

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

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

我用命令发布了解决方案

{ dotnet publish -r linux-arm }

当我尝试在Rpi上同样运行时,出现异常。随附的屏幕截图包含了详细信息。Error.png

任何帮助解决此问题的方法都会很有用

1 个答案:

答案 0 :(得分:0)

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,它将尝试使用格式为here的名称加载静态库。稍微剖析一下,您会发现,到目前为止,不是“ 64bit”的任何“ linux”平台(尽管pi上的proc为64位,但您在那里使用的是Linux发行版,包括raspbian,可能不是)将查找libgrpc_csharp_ext.x86.so。当您dotnet publish -r linux-arm时,您会在构建输出中看到该库,但是不幸的是,它是错误的(我认为publish在运行时找不到特定库时只是抓住了“最接近的库”。夹)。

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