.net core 如何在dotnet core中的raspberri pi中部署示例GRPC[客户机-服务器]解决方案

.net core 如何在dotnet core中的raspberri pi中部署示例GRPC[客户机-服务器]解决方案,.net-core,raspbian,grpc,.net Core,Raspbian,Grpc,我试图在运行Raspbian操作系统的raspberri Pi中运行一个简单的GRPC客户机-服务器代码 我正在使用的语言-C#dotnet core(2.1) 我从下载了一个示例项目 这是一个dotnet核心项目。我能够在Windows环境下运行它,我也能够修改此代码中的.proto文件并成功运行 我使用命令发布了解决方案 { dotnet publish -r linux-arm } 当我尝试在Rpi上运行相同的程序时,我遇到了异常。附加的截图有它的细节 任何帮助我们度过难关的方法都是非常

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

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

我从下载了一个示例项目

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

我使用命令发布了解决方案

{ dotnet publish -r linux-arm }
当我尝试在Rpi上运行相同的程序时,我遇到了异常。附加的截图有它的细节


任何帮助我们度过难关的方法都是非常有用的

tl;dr问题在于libgrpc_csharp_ext本机库,该库目前没有为arm7处理器编译和构建。我已经为arm7编译了它(在pi上),并发布了一个nuget包来弥补这一差距,直到他们完全支持它:

当我完成我正在处理的其他工具和模板时,我将更新一个博客文章的链接

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


我在上面创建的nuget包是为arm7编译的——我实际上将grpc repo克隆到了一个pi上,剥离了足够多的/csharp构建,只需制作libgrpc_csharp_ext。包使用的“技巧”是将库放在包中的runtimes/linux arm/native文件夹中,dotnet core在发布时会识别哪个库并将其拉入构建输出中-但该库仍然命名为libgrpc_csharp_ext.x86。因此,由于NativeMethods.cs格式化库名称的方式。

对于其他正在查找博客文章的人,可在此处找到该库