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

引用外部项目的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:07:32