如何編譯C#版本的Protocol Buffers與gRPC服務端,客戶端程式碼

Celery發表於2019-05-24

定義Protocol Buffers

message.proto

syntax = "proto3";
package Greet;

// The request message containing the user's name.
message HelloRequest {
    string name = 1;
}

// The response message containing the greetings.
message HelloReply {
    string message = 1;
}
複製程式碼

greet.proto

syntax = "proto3";
package Greet;

option csharp_namespace = "Greet";

import "message.proto";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
複製程式碼

csharp_namespace這個是針對C#獨有的可選配置,如果namespace與package相同,可以不用寫。

使用protoc手動編譯

protoc.exe可以在以下地址下載:github.com/protocolbuf…

如果使用nuget安裝過Google.Protobuf.Tools,在這個目錄也可以找到protoc.exe %UserProfile%.nuget\packages\Google.Protobuf.Tools\3.7.0\tools\windows_x64\protoc.exe

最簡單的編譯bat可以這樣寫:

protoc --csharp_out=./ greet.proto
複製程式碼

--csharp_out是必選引數, 還有一個-I為可選引數,預設為當前目錄,指定程式碼目錄

如果需要同時編譯服務端和客戶端程式碼,需要grpc_csharp_plugin,可以在Grpc.Tools nuget包中找到: %UserProfile%.nuget\packages\Grpc.Tools\1.20.0\tools\windows_x64\grpc_csharp_plugin.exe

set PLUGIN=%UserProfile%\.nuget\packages\Grpc.Tools\1.20.0\tools\windows_x64\grpc_csharp_plugin.exe
D:\Grpc\protoc-3.7.1-win64\bin\protoc.exe --csharp_out=./ greet.proto --grpc_out ./ --plugin=protoc-gen-grpc=%PLUGIN%
複製程式碼

使用Visual Studio和Grpc.Tools自動編譯

Grpc.Tools在1.17版之後,可以與MSBuild整合,自動根據proto檔案編譯生成C#程式碼。

生成的程式碼可以在obj/Debug/TARGET_FRAMEWORK資料夾中找到。

配置方式:

  • 新增Grpc.Tools nuget包
  • 在proto檔案的屬性中,將Build Action修改為Protobuf compiler
  • Build Action如果設定為Content,Custom Tool設定為MSBuild:Compile也可

注意:如果proto檔案中使用了import匯入其他proto檔案,需要寫入在Visual Studio中的完整路徑,例如:

import "Protos/message.proto";
複製程式碼

相關文章