Protobuf C#生成无参构造器为internal如何配置为public
Protobuf C# 生成的消息类无参构造器为internal的解决方法
默认状态下Protobuf C#生成器会为所有消息类生成public无参构造器,无需额外开启配置,完全可以满足泛型模板new()约束的要求。如果生成的构造器为internal访问级别,本质是生成流程中开启了降低访问级别的相关配置,按以下顺序逐一排查即可定位问题:
排查步骤
- 检查单文件proto配置
打开对应MyProtobufMessage的.proto文件,确认是否存在option internal_access_level = true;配置。该选项会强制当前proto生成的所有消息类、构造器、成员属性使用internal访问级别,找到后直接删除该行配置,重新生成代码即可将构造器恢复为public级别。 - 检查项目全局生成配置
打开项目的.csproj文件,搜索Protobuf相关的MSBuild属性,确认是否存在<Protobuf_InternalAccessLevel>true</Protobuf_InternalAccessLevel>配置项。该配置会对项目下所有proto文件的生成结果生效,等价于全局开启内部访问级别,找到后将值改为false,或直接删除该配置行。 - 校验工具版本匹配性
当前使用的Google.Protobuf runtime版本为3.11.4,需要确认随Grpc.Tools NuGet包引入的protoc_csharp代码生成插件版本是否和该runtime版本对齐。如果插件版本和runtime版本的大版本不匹配,会出现生成代码的访问级别和官方预期不一致的问题,建议将Grpc.Tools版本调整为3.11.x系列,和runtime版本保持一致后,重新还原NuGet依赖再触发生成流程。
残留缓存清理方案
如果以上配置排查完成后,生成的构造器级别依然不符合预期,可清理旧的生成缓存后重新编译:
- 删除项目目录下的
bin、obj文件夹,清除所有历史自动生成的代码残留 - 重新执行项目编译,让Protobuf生成器基于最新配置重新生成代码,避免旧缓存导致的访问级别异常
注意:不要通过手写同签名public无参构造器的方式规避问题,由于生成的类本身已存在internal无参构造器,额外添加相同签名的构造器会触发编译错误。
内容的提问来源于stack exchange,提问作者K.Miao
相关产品推荐
相关产品推荐

