引用外部项目的gRPC proto引发InvalidOperationException异常
解决gRPC JsonTranscoding跨项目复用DLL的类型不匹配问题
核心原因
异常本质是Google.Api.HttpRule类型的程序集标识不匹配:外部项目生成的DLL中,该类型来自自定义的BookingService.RpcApi程序集,而客户端/服务端项目依赖的是官方签名的Google.Api.CommonProtos程序集,两者类型无法兼容。
具体解决方案
1. 统一所有项目的依赖版本
- 确保外部proto项目、客户端、服务端项目全部引用完全相同版本的
Google.Api.CommonProtos以及相关gRPC/Protobuf NuGet包,禁用版本自动降级或升级。 - 若使用SDK风格项目,可在解决方案根目录的
Directory.Packages.props中强制统一版本:<Project> <PropertyGroup> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> </PropertyGroup> <ItemGroup> <PackageVersion Include="Google.Api.CommonProtos" Version="2.5.0" /> <PackageVersion Include="Grpc.AspNetCore" Version="2.59.0" /> <PackageVersion Include="Google.Protobuf" Version="3.25.3" /> </ItemGroup> </Project>
2. 避免外部项目嵌入公共Proto类型
- 检查外部proto项目配置,禁止将
Google.Api.CommonProtos的代码嵌入到输出DLL:- 在外部项目的
.csproj中,确保仅编译自定义proto,移除官方公共proto的编译:<ItemGroup> <Protobuf Include="**/*.proto" GrpcServices="Both" /> <Protobuf Remove="google/api/*.proto" /> </ItemGroup> - 删除外部项目中自行添加的
google/api/http.proto等官方文件,直接使用NuGet包提供的官方定义,避免重复编译生成不同版本的类型。
- 在外部项目的
3. 添加程序集绑定重定向
若统一版本后仍有问题,可通过绑定重定向强制所有项目使用同一版本的Google.Api.CommonProtos:
- 在客户端/服务端项目的
app.config(桌面应用)或web.config(ASP.NET项目)中添加:<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Google.Api.CommonProtos" publicKeyToken="3ec5ea7f18953e47" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.5.0.0" newVersion="2.5.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
4. 改用项目引用替代DLL引用
将外部proto项目配置为纯代码生成类库,客户端/服务端项目直接通过<ProjectReference>引用该项目,而非添加DLL引用,确保编译上下文一致:
- 外部项目仅保留proto文件和必要的NuGet引用,客户端/服务端项目添加引用:
<ItemGroup> <ProjectReference Include="..\YourExternalProtoProject\YourExternalProtoProject.csproj" /> </ItemGroup>
验证步骤
- 清理所有项目的bin/obj目录,重新生成整个解决方案
- 检查外部项目输出DLL的依赖,确认
Google.Api.CommonProtos是引用而非嵌入 - 运行客户端/服务端,验证JsonTranscoding功能正常
内容的提问来源于stack exchange,提问作者Yesname
相关产品推荐
相关产品推荐

