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

我正在开发一个使用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/csharptour

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

我试过每种语言的命令行参数:

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#编译的任何其他文件吗?


我知道如何在C#中创建原始文件

  • 打开视觉工作室,打开nuget命令行,键入: Install-Package Google.ProtocolBuffers ,链接:Google.ProtocolBuffers 2.4.1.555
  • 找到Package / Google.ProtocolBuffers.2.4.1.555 / tools / ProtoGen.exe
  • 使用命令行,键入: 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(), "..PackageGoogle.ProtocolBuffers.2.4.1.555toolsProtoGen.exe")
            out = "-output_directory=%s" % (os.path.join(os.getcwd(), "..Commonlibsprotos"))
            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
    

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

    protoc-2.6.1-win32.zip

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

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

    所以,下载protoc V3.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文件

    链接地址: http://www.djcxy.com/p/64791.html

    上一篇: Generation of C# files with Google Protocol Fails

    下一篇: Protoc error in Windows