Back to results for “.NET CLI”
.NET › gRPC Services

How do you define a gRPC service contract using Protocol Buffers (.proto files), and how does code generation work in a .NET project?

Intermediate

Answer

A .proto file declares message types (structured data with numbered fields) and service definitions (RPC method signatures) using protobuf's interface definition language; the Grpc.Tools NuGet package's MSBuild integration automatically generates strongly-typed C# client and server base classes from the .proto file at build time, which you then implement (server) or call (client) directly in C#.
// Greeter.proto
syntax = "proto3";
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest { string name = 1; }
message HelloReply { string message = 1; }

<!-- .csproj -->
<ItemGroup>
  <Protobuf Include="Protos\Greeter.proto" GrpcServices="Server" />
</ItemGroup>
Real-world example A team defines their service contract once in a shared .proto file, and both the C# server project and a separate C# client project reference it with different GrpcServices settings (Server vs Client), generating appropriately-typed code for each side automatically at build time.

Common follow-ups: What do the numbered fields in a proto message (like 'name = 1') actually mean and why do they matter for compatibility?