【问题标题】:Protobuf C# generates internal (versus public) constructorProtobuf C# 生成内部(相对于公共)构造函数
【发布时间】:2021-03-19 22:33:44
【问题描述】:

由于某种原因,生成的代码包含内部构造函数而不是公共构造函数:

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    internal MyProtobufMessage()
    {
        OnConstruction();
    }

来自official document,应该是公开的:

  // Parameterless constructor which calls the OnConstruction partial method if provided.
  public Foo();

我想知道是否可以指定任何选项来生成公共构造函数。我需要它是公共的,因为我使用的是通用模板,它要求类型具有公共构造函数(new() 约束)。

我正在使用的 Protobuf 版本:3.11.4

.proto 文件是这样的:

syntax = "proto3";
import "timestamp.proto";

package MyNamespace;
option csharp_namespace = "MyNamespace";

message MyProtobufMessage{
   ...
}

【问题讨论】:

  • 我删除了 protobuf-net 标签,因为您使用的是 Google 工具,而不是 protobuf-net。也就是说:protobuf-net 喜欢并接受公共无参数构造函数!你可以通过protogen.marcgravell.com 运行你的架构,看看它想要什么。

标签: protocol-buffers protobuf-csharp-port


【解决方案1】:

可以选择将整个消息类设为内部,但 AFAIK 应该始终有一个公共的无参数构造函数。

您知道您的.protos 文件是如何编译的吗?

注意代码生成是由一个单独的包 Google.Protobuf.tools 完成的 - 你应该检查这个包也是 3.11.4 (并且你的 .proto 编译正在选择最新版本的 protoc)。

编译过程应该是类似如下的命令: C:\Users\Me\.nuget\packages\Google.Protobuf.tools\3.11.4\tools\windows_x64\protoc.exe .\test.proto --csharp_out .\

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 2018-10-23
    • 2011-04-16
    • 2011-10-23
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多