从proto文件生成C#,反之亦然,解释自定义选项

从proto文件生成C#,反之亦然,解释自定义选项,c#,code-generation,protocol-buffers,protobuf-net,C#,Code Generation,Protocol Buffers,Protobuf Net,我正在使用,我正在尝试: 从.proto文件生成C#类 从C#类生成.proto文件 这很容易使用: protogen.exe工具 Serializer.GetProto()方法 但问题是我需要支持protobuffer,而且它似乎不像我想象的那么简单 让我解释一下: 从包含应用于消息和字段的自定义选项的原型文件中,我想生成一个由.NET自定义属性修饰的C#类 从一个由自定义属性修饰的C#类中,我想生成一个proto文件,其中自定义选项应用于消息和字段 基本上,考虑到: message pers

我正在使用,我正在尝试:

  • 从.proto文件生成C#类
  • 从C#类生成.proto文件
  • 这很容易使用:

  • protogen.exe
    工具
  • Serializer.GetProto()
    方法
  • 但问题是我需要支持protobuffer,而且它似乎不像我想象的那么简单

    让我解释一下:

  • 从包含应用于消息和字段的自定义选项的原型文件中,我想生成一个由.NET自定义属性修饰的C#类
  • 从一个由自定义属性修饰的C#类中,我想生成一个proto文件,其中自定义选项应用于消息和字段
  • 基本上,考虑到:

    message person {
       option (my_message_option) = true;
    
       optional string firstname = 1 [(my_field_option) = 42];
       optional string lastname = 2 [(my_field_option) = 12];
       optional int age = 3;
    }
    
    我想生成:

    [ProtoContract, MyMessageOption(true)]
    public class Person
    {
        [ProtoMember(1), MyFieldOption(42)]
        public string Firstname;
    
        [ProtoMember(2), MyFieldOption(12)]
        public string Firstname;
    
        [ProtoMember(3)]
        public string Firstname;
    }
    
    …反之亦然

    注:

    • 自定义选项定义 (
      my_message_选项
      我的字段\u选项
      )可以已经存在 在原型文件中(例如, my_custom_options.proto)和 自定义属性类也可以 存在于某处 (
      MyMessageOptionAttribute
      MyFieldOptionAttribute
    • 我尝试使用protogen.exe和 自定义xslt,但protogen似乎没有 支持自定义选项

    实现这一目标的首选方法是什么解决方案不必依赖protobuf网络。

    目前没有一种简单的方法可以做到这一点。所需的更改主要是csharp.xslt文件。这方面有一个bug,但尚未修复。

    我最终从中派生了ProtoGen项目,以公开一些内部类型(大部分是生成器),并通过允许自定义生成器注册来扩展
    SourceGenerators

    这样,我就能够使用proto描述符对象模型来编写自己的C#生成器

    一个棘手的问题是在启动解析之前注册自定义选项类型:

  • 生成与自定义选项对应的C类型(使用
    Protoc.exe
    然后使用
    ProtoGen.exe
  • 使用生成的
    registeralExchanges
    方法配置
    ExtensionRegistry
  • 使用自己的C#生成器开始代码生成。在每个生成器中,您都可以访问上下文的
    描述符.Options
    集合

  • 我已经尝试创建一个特定的xslt文件,但无法访问proto文件中使用的自定义选项。你能想出另一种基于非protobuf网络的解决方案吗?@Romain这不是我有机会看到的配置,所以:不是我想的,不是。如果你通过xml模板(
    -t:xml
    或类似的东西)运行它,它会告诉你它知道什么,这可能表明这些数据隐藏在哪里——假设它不需要对描述符进行更新。是的,这就是我尝试的(
    -t:xml
    ),但所有自定义选项在生成的xml文件中都显示为
    unexported_option
    。我想做同样的事情,从一个原型文件生成一个修饰的C#文件(用于protobuf net)。你能举例说明你是如何做到这一点的吗?谢谢