使用Google协议生成C#文件失败

Ram*_*Ram 6 c# c++ java protocol-buffers

我正在开发一个使用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;
}
Run Code Online (Sandbox Code Playgroud)

我指的是以下教程: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的情况下有一些警告,Java和C++编译也能正常工作.但是我用C#得到了以下输出:

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

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

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

Sas*_*sky 6

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

protoc-2.6.1-win32.zip

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

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

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

请注意,从版本3.0.0-beta-1开始,C#代码生成器仅支持生成proto3:

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


小智 4

我知道如何在 C# 中生成原型文件

  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 proto 文件 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()
Run Code Online (Sandbox Code Playgroud)

配置文件.txt

base.proto,test.proto,addressbook.proto
Run Code Online (Sandbox Code Playgroud)