7

在 C# 中,我们从 protobuf-net 获得的 .proto 中有命名空间,但没有任何命名空间。所以问题是如何使 protobuf-net 生成(并在内部使用)带有命名空间/包的 .proto 文件。

例如,当我们解析所有项目以制作 .proto 文件以将 C++ 应用程序连接到我们的 C# 应用程序时,我们得到了大量的

enum AnimationCode {
   None = 0;
   Idle = 1;
   //...
}

enum SessionCode {
   None = 0;
   //...
}

因此,当我们将统一项目 .proto 文件提供给 protogen 编译器时,我们得到了大量

枚举类型“SessionStateCode”没有名为“None”的值。

请注意,枚举值使用 C++ 范围规则,这意味着枚举值是其类型的兄弟,而不是其子类型。

并且没有 C++ 代码。

重点是使编码的 C# 消息至少可以从 C++ 读取

4

2 回答 2

2

protobuf-net 中目前没有任何代码来执行自动名称冲突修复,尽管我很想知道您是否有任何建议。另一种选择是:

    enum AnimationCode {
        [ProtoEnum(Name="AnimationCode_None")]
        None = 0,
        Idle = 1
    }

这里,.proto 将AnimationCode_None在生成 scema 时使用;事实上,它将是:

enum AnimationCode {
   AnimationCode_None = 0;
   Idle = 1;
}

我已经检查了MetaType/ API,目前ValueMember看起来很难.Name在运行时设置,但如果您更愿意将它们设置运行时而不是用属性装饰。MetaType

于 2012-12-10T14:56:54.430 回答
0

你试过这个吗?

package MyNamespace{
    enum AnimationCode {
       None = 0;
       Idle = 1;
       //...
    }
}
于 2012-12-10T14:32:25.403 回答