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

问题描述 投票:0回答:1

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

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

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

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

我发布了解决方案,因为它是命令

{ dotnet publish -r linux-arm }

当尝试在Rpi上运行相同时,我得到例外。附件截图有详细信息。

任何有助于实现这一目标的帮助都会很有用

.net-core raspbian grpc
1个回答
1
投票

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的名称加载静态库。解析一点,你会看到,就像现在一样,任何'linux'平台都不是'64bit'(尽管pi上的proc是64位,你在那里使用的linux发行版,包括raspbian,可能不是)将寻找libgrpc_csharp_ext.x86.so。当你dotnet publish -r linux-arm时,你会在构建输出中看到那个库,但不幸的是,它是错误的(我认为发布只是抓住'最接近的那个',当它在runtimes文件夹中找不到特定的库时)。

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

© www.soinside.com 2019 - 2024. All rights reserved.