【问题标题】:Generation of C# files with Google Protocol Fails使用 Google 协议生成 C# 文件失败
【发布时间】:2015-10-23 06:30:51
【问题描述】:

我正在开发一个使用 Java、C# 和 C++ 应用程序的项目。为了在它们之间进行通信,我尝试使用 Google 协议缓冲区。我正在使用以下 .proto 文件,该文件取自示例:

package tutorial;

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}

我指的是以下教程: https://developers.google.com/protocol-buffers/docs/csharptutorial

其他语言的教程也在那里。

我为每种语言尝试了以下命令行参数:

Java

C:\ProtoBuf\protoc -I=C:\trash --java_out=C:\trash C:\trash/addressbook.proto

C++

C:\ProtoBuf\protoc -I=C:\trash --cpp_out=C:\trash C:\trash/addressbook.proto

C#

C:\ProtoBuf\protoc -I=C:\trash --csharp_out=C:\trash C:\trash/addressbook.proto

Java 和 C++ 编译可以正常工作,即使在 Java 的情况下会出现一些警告。但我得到以下输出 C#

--csharp_out: protoc-gen-csharp: 系统找不到指定的文件。

我正在使用这个编译器:https://github.com/google/protobuf/releases/download/v2.6.1/protoc-2.6.1-win32.zip

我在这里做错了什么?我需要任何其他文件来进行 C# 编译吗?

【问题讨论】:

    标签: java c# c++ protocol-buffers


    【解决方案1】:

    您正在尝试使用旧版本的 protoc 生成 C# 文件

    protoc-2.6.1-win32.zip

    proto2 和 proto3 的 C# 代码生成器仅在 Version 3.0.0-alpha-3 中引入

    引入了两种新的语言实现(Objective-C、C#) proto3.

    所以,下载 protoc Version 3.0.0-alpha-3,安装并调用: protoc -I=$SRC_DIR --csharp_out=$DST_DIR $SRC_DIR/your.proto

    注意Version 3.0.0-beta-1开始的C#代码生成器只支持生成proto3:

    支持 Proto3 语义; C# codegen 禁止使用 proto2 文件

    【讨论】:

    • 有这么多版本/口味,很难确定一个特定的。文档也很少且分散。谢谢你的回答!
    • 截至今天,文档 (developers.google.com/protocol-buffers/docs/…) 很糟糕。 C# 教程链接到 2.6.1 版的下载,该版本显然不支持 C#。
    【解决方案2】:

    我知道如何在 c# 中生成 proto 文件

    1. 打开visual studio,打开nuget命令行,输入:Install-Package Google.ProtocolBuffers,链接:Google.ProtocolBuffers 2.4.1.555
    2. 找到 Package/Google.ProtocolBuffers.2.4.1.555/tools/ProtoGen.exe
    3. 使用命令行,输入:ProtoGen.exe addressbook.proto -output_directory=C:\trash

    我写了一个python脚本来生成原始文件,gen.py

    import os, subprocess, threading
    
    def main():
        with open("conf.txt") as file:
            exe = os.path.join(os.getcwd(), "..\\Package\\Google.ProtocolBuffers.2.4.1.555\\tools\\ProtoGen.exe")
            out = "-output_directory=%s" % (os.path.join(os.getcwd(), "..\\Common\\libs\\protos"))
            def gen(proto):
                subprocess.check_call([exe, os.path.join("protos", proto), out])
            list = []
            for proto in file.read().split(','):
                t = threading.Thread(target = gen, args = (proto, ))
                t.start()
                list.append(t)
            for t in list:
                t.join()
    
    if __name__ == '__main__':
        main()
    

    conf.txt

    base.proto,test.proto,addressbook.proto
    

    【讨论】:

    • 这样会发出Service 代,如何启用?
    【解决方案3】:

    我在所有路径中使用 /(斜杠)而不是 \(反斜杠)解决了我的所有问题。

    protoc.exe -I=D:/dev/xyz/projects --csharp_out=d:/temp D:/dev/xyz/projects/messages.proto

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多