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

.NET 6构建gRPC服务失败求助:protoc.exe报错退出

构建gRPC服务时protoc.exe退出码-1073741819问题解决

问题描述

按照官方gRPC入门教程构建服务时,构建失败,错误输出如下:

Build started...
1>------ Build started: Project: GrpcGreeter, Configuration: Debug Any CPU ------
1>Build started 12.03.2023 03:04:46.
1>Target GenerateTargetFrameworkMonikerAttribute:
1>  Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
1>Target _Protobuf_CoreCompile:
1>  C:\Users\Paweł\.nuget\packages\grpc.tools\2.40.0\build\_protobuf\Google.Protobuf.Tools.targets(280,5): error MSB6006: "C:\Users\Paweł\.nuget\packages\grpc.tools\2.40.0\tools\windows_x64\protoc.exe" exited with code -1073741819.
1>Done building target "_Protobuf_CoreCompile" in project "GrpcGreeter.csproj" -- FAILED.
1>
1>Done building project "GrpcGreeter.csproj" -- FAILED.
1>
1>Build FAILED.
1>
1>C:\Users\Paweł\.nuget\packages\grpc.tools\2.40.0\build\_protobuf\Google.Protobuf.Tools.targets(280,5): error MSB6006: "C:\Users\Paweł\.nuget\packages\grpc.tools\2.40.0\tools\windows_x64\protoc.exe" exited with code -1073741819.
1>    0 Warning(s)
1>    1 Error(s)
1>
1>Time Elapsed 00:00:01.70
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Build started at 3:04 AM and took 02,212 seconds ==========

已尝试切换.NET 5/6/7版本,问题依旧。怀疑是NuGet包路径中的非ASCII字符(如用户名Paweł中的ł)导致。

附自动生成的proto文件:

syntax = "proto3";

option csharp_namespace = "GrpcGreeter";

package greet;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

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

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

自动生成的GreeterService.cs:

using Grpc.Core;
using GrpcGreeter;

namespace GrpcGreeter.Services
{
    public class GreeterService : Greeter.GreeterBase
    {
        private readonly ILogger<GreeterService> _logger;
        public GreeterService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply
            {
                Message = "Hello " + request.Name
            });
        }
    }
}

解决方案

1. 确认路径问题

将项目移动到不含非ASCII字符的路径(如C:\Projects\GrpcGreeter),重新执行构建。如果构建成功,即可确认是路径中的非ASCII字符导致protoc.exe执行失败。

2. 修改NuGet全局包路径

将NuGet包存储到纯ASCII路径下:

  • 打开NuGet配置文件:路径为%appdata%\NuGet\NuGet.Config
  • 在<configuration>节点内添加或修改<config>配置:
    <configuration>
      <config>
        <add key="globalPackagesFolder" value="C:\NuGetPackages" />
      </config>
      <!-- 保留原有其他配置 -->
    </configuration>
    
  • 清理NuGet缓存:执行命令 dotnet nuget locals all --clear
  • 还原项目包:执行命令 dotnet restore
  • 重新构建项目

3. 升级Grpc.Tools包版本

旧版本的Grpc.Tools(如2.40.0)存在Unicode路径兼容问题,升级到最新稳定版可解决:

  • 在Visual Studio中打开NuGet包管理器,找到Grpc.Tools并升级到最新版本(如2.59.0+)
  • 或直接修改项目的.csproj文件,更新包版本:
    <PackageReference Include="Grpc.Tools" Version="2.59.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    
  • 执行dotnet restore后重新构建

4. 其他排查方向

  • 确保Windows区域设置中启用了Unicode支持(控制面板→区域→管理→更改系统区域设置→勾选“Beta版:使用Unicode UTF-8提供全球语言支持”,重启系统后尝试)
  • 以管理员身份运行Visual Studio,重新构建项目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:17:23