我试图在运行Raspbian操作系统的raspberri Pi中运行简单的GRPC客户端-服务器代码。
我正在使用-C#dotnet core(2.1)的语言
我从here下载了一个示例项目。
这是一个dotnet核心项目。我可以在Windows环境中运行它,也可以在此代码中修改.proto文件并成功运行。
我用命令发布了解决方案
{ dotnet publish -r linux-arm }
当我尝试在Rpi上同样运行时,出现异常。随附的屏幕截图包含了详细信息。
任何帮助解决此问题的方法都会很有用
答案 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格式化库名称的方式。