2015-10-23 3 views
6

Ich arbeite an einem Projekt, das Java, C# und auch C++ - Anwendungen verwendet. Um zwischen ihnen zu kommunizieren, versuche ich den Google-Protokollpuffer zu verwenden. Ich verwende folgende .proto-Datei, die aus den Beispielen genommen wurde: https://developers.google.com/protocol-buffers/docs/csharptutorialGenerierung von C# -Dateien mit Google-Protokoll schlägt fehl

Tutorials für andere Sprachen sind auch da:

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; 
} 

ich folgende Tutorial beziehe mich.

I versuchte folgende Befehlszeilenargumente für jede Sprache:

Java:

C: \ protobuf \ Protoc -I = C: \ trash --java_out = C: \ C trash : \ 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 und C++ Compilations ordnungsgemäß funktionieren auch mit einiger Warnung bei Java. Aber ich habe folgende Ausgabe mit C#:

--csharp_out: Protoc-gen-csharp: Das System kann die angegebene Datei nicht finden.

ich diesen Compiler bin mit: https://github.com/google/protobuf/releases/download/v2.6.1/protoc-2.6.1-win32.zip

Was mache ich hier falsch? Benötige ich weitere Dateien für die C# -Kompilierung?

Antwort

4

Ich weiß, wie man gen proto-Dateien in C#

  1. offen Visual Studio, offene nuget Befehlszeile ein: Install-Package Google.ProtocolBuffers, Link: Google.ProtocolBuffers 2.4.1.555
  2. Fund Verpackung/Google. ProtocolBuffers.2.4.1.555/tools/ProtoGen.exe
  3. Verwendung Befehlszeile, Typ: ProtoGen.exe addressbook.proto -output_directory = C: \ trash

Ich schreibe gen proto-Dateien ein Python-Skript, 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 
+0

Auf diese Weise emittiert 'Service' Generation, wie das zu ermöglichen? – tchelidze

5

Sie versuchen, C# Dateien mit der alten Version der Protoc

protoc-2.6.1-win32.zip

C# Codegenerator für beide proto2 zu erzeugen und Proto3 wurde nur in Version 3.0.0-alpha-3

eingeführt Zwei neue Sprachimplementierungen eingeführt (Objective -C, C#) zu proto3.

So, download Protoc Version 3.0.0-alpha-3, installieren Sie sie und rufen: protoc -I=$SRC_DIR --csharp_out=$DST_DIR $SRC_DIR/your.proto

Vorsicht, die von Version 3.0.0-beta-1 C# Codegenerator gestartet unterstützt nur proto3 zu erzeugen:

Proto3 Semantik unterstützt; Proto2-Dateien sind für C# Codegen verboten

+0

Mit so vielen Versionen/Flavours ist es schwierig, einen bestimmten zu finden. Die Dokumentation ist auch minimal und verstreut. Vielen Dank für Ihre Antwort! – Farax

+1

Ab heute ist die Dokumentation (https://developers.google.com/protocol-buffers/docs/csharptutorial#defining-your-protocol-format) beschissen. Das C# -Tutorial verweist auf einen Download der Version 2.6.1, die C# offensichtlich nicht unterstützt. – ken2k

Verwandte Themen