如何在 C# 中为 gRPC 创建正确的自动生成代码?

问题描述

我在 C# 项目中创建了一个 proto 文件,并尝试通过构建解决方案来自动生成 C# 代码。 但是,扩展名 grpc.cs 下的文件有问题。

''' 

/// <summary>Creates a new client for Greeter</summary>
   /// <param name="channel">The channel to use to make remote calls.</param>
      public GreeterClient(grpc::Channel channel) : base(channel)
      {
      }

'''

上面的片段来自示例,其中公共 GreeterClient 具有参数 (grpc::Channel channel) 但在下面的片段中,它是 (grpc::ChannelBase channel)

'''

/// <summary>Creates a new client for samples</summary>
/// <param name="channel">The channel to use to make remote calls.</param>
public samplesClient(grpc::ChannelBase channel) : base(channel)
{
}

'''

这会引发一个错误,告诉'找不到客户端频道

如何配置生成grpc.cs文件,使参数为(grpc::Channel channel)

解决方法

我不确定你在做什么(...试图自动生成...

这是 .NET Framework 项目的示例,.NET Core 创建的略有不同 - 这是 .NET Core 入门的绝佳资源:ASP.NET Core gRPC for WCF Developers

通常你做什么

  1. 创建项目并安装相关的 Nuget 包:GrpcGrpc.Core 以及最重要的 Grpc.Tools
  2. 添加新文件。随意命名,但扩展名必须是 .proto
  3. 在这个 proto 文件中填充一些数据,例如:
syntax = "proto3";

option csharp_namespace = "MyNamespace";

...
...
  1. 右键单击此文件并选择 Properties
  2. 在“属性”面板中,选择 Protobuf 作为 Build action。所以它应该是这样的:

enter image description here

  1. 重新构建解决方案
  2. 添加另一个 C# 文件,随意命名
  3. 在此 C# 文件中,开始引用您在 proto 文件中创建的结构。喜欢:

MyNamespace.MyServer server = new MyNamespace.MyServer()

但实际上您应该从 ptotobuf 为您创建的基类继承,如下所示:

 public class GrpcImplementationClass: MyNamespace.MyServer.MyServerBase
 {

   public override MyFunction()
   {
   ...
   ...

附言Youtube

上有很多针对初学者的教程