You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

protoc生成的C#代码无法编译问题求助

解决Grpc.Core在.NET 4.8下的编译错误

核心问题:版本不匹配

你遇到的两个编译错误,本质是Grpc.Tools工具版本、Grpc.Core库版本、Google.Protobuf版本三者不统一,且使用了适配新版grpc-dotnet的代码生成插件,导致生成的代码与旧版Grpc.Core API不兼容。


解决步骤

1. 清理并统一NuGet包版本

  • 移除Grpc.Net.Client:你使用的是旧版Grpc.Core,不需要这个针对ASP.NET Core的包。
  • 安装完全同版本的三个核心包:
    • Grpc.Core:选择支持.NET Framework 4.8的稳定版(推荐2.46.0,这是Grpc.Core最后几个维护版本之一)
    • Grpc.Tools:必须和Grpc.Core版本完全一致(如2.46.0)
    • Google.Protobuf:选择与Grpc.Core版本匹配的依赖版本(Grpc.Core 2.46.0对应Google.Protobuf 3.21.9)

2. 使用匹配版本的protoc和代码生成插件

不要使用第三方protoc,直接调用Grpc.Tools包内置的工具,确保版本统一:

# 替换路径中的版本号为你安装的Grpc.Tools版本
"C:\users\foo\.nuget\packages\grpc.tools\2.46.0\tools\windows_x64\protoc.exe" --proto_path=. --csharp_out=grpc --grpc_out=grpc --plugin=protoc-gen-grpc="C:\users\foo\.nuget\packages\grpc.tools\2.46.0\tools\windows_x64\grpc_csharp_plugin.exe" .\greet.proto

3. 检查.proto文件的基础配置

确保你的.proto文件开头包含正确的命名空间和语法声明,示例:

syntax = "proto3";
option csharp_namespace = "Greet"; // 与生成代码的命名空间一致
package greet;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
  rpc Prepare (PrepareRequest) returns (PrepareResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

message PrepareRequest {
  // 你的字段定义
}

message PrepareResponse {
  // 你的字段定义
}

4. 重新生成并替换代码

  • 删除之前生成的Greet.cs和GreetGrpc.cs文件
  • 执行上述修正后的protoc命令,生成新的代码文件
  • 将新文件添加到项目中,重新编译

错误原因说明

  1. 'HelloRequest' 不包含 'ParseFrom' 的定义:
    新版Google.Protobuf将ParseFrom合并为Parse方法,但旧版Grpc.Core依赖的Google.Protobuf版本仍使用ParseFrom。版本不匹配时,生成的代码会调用不存在的方法。

  2. 没有与Method<...>的必需参数'responseMarshaller'对应的实参:
    旧版Grpc.Core的Method构造函数签名为:

    public Method(MethodType type, string serviceName, string name, Marshaller<TRequest> requestMarshaller, Marshaller<TResponse> responseMarshaller);
    

    而新版grpc-dotnet的构造函数参数顺序/数量不同。你生成的代码是针对新版的,导致参数缺失,这是因为使用了不匹配版本的grpc_csharp_plugin。

内容的提问来源于stack exchange,提问作者Elektito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:02:41