.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
相关产品推荐
相关产品推荐

