C# Protocol buffer 批处理工具

新版步移

ProtobufGenBatTool V3 更方便、高效

工具一

名称:ProtobufGenBatTool

因项目需要使用到Protocol buffer,所以最近学习了一下protogen.exe生成cs代码的方法
但是发现protogen.exe参数没有设置输出的cs目录,所以重新写了个工具处理,解决这个问题

参数说明

  • ProtobufGenBatTool.exe 是我们的批处理工具(相对目录或绝对目录都OK)
  • -protoc_file 是指定protoc.exe工具文件的路径(相对目录或绝对目录都OK)
  • -protogen_file 是指定protogen.exe工具文件的路径(相对目录或绝对目录都OK)
  • -proto_file_inputpath 是指定包含.proto文件的一个或多的目录(相对目录或绝对目录都OK),多个目录以空格来分隔
  • -cs_file_outputpath 是指定我们的cs文件的输出目录(相对目录或绝对目录都OK)

另个bat脚本版本的实现

但是bat对字符串处理,还有代码语法、可读性、方便程度、等,都没有高级语言方便

REM description :   generate the .cs files from .proto files
REM author      :   Jave.Lin
REM date        :   2018-03-13

@echo off
setlocal enabledelayedexpansion

REM cs file out put path
set cs_out_path=%~1
if "%cs_out_path%"=="" (
    set cs_out_path=cs\
    )

if "%%cs_out_path:~0,-1%%"==%cs_out_path:~-1%  else (set cs_out_path=!cs_out_path!\)

REM protoc file
set protoc_file=protoc.exe

REM protogen file
set protogen_file=protogen.exe

REM proto files
REM set proto_files=ProtoJaveTestData.proto,ProtoMyData.proto
set proto_files=*.proto

echo Generating...

for /R %%s in (!proto_files!) do ( 
    set fileName=%%s

    echo handling file : !fileName!

    set csFileName=!fileName:~0,-6!.cs
    set protobinFileName=!fileName:~0,-6!.protobin

    set outputProtobinFileName=!protobinFileName:%~dp0=!
    !protoc_file! -I=%~dp0 --descriptor_set_out=!protobinFileName:%~dp0=! --include_imports !fileName!
    !protogen_file! !protobinFileName!
)

echo Generation complete!

echo moving cs file...

RD /s /q !cs_out_path!
MD !cs_out_path!

for %%s in (*.cs) do (
    set moveToFileName=!cs_out_path!%%s
    move %%s !moveToFileName!
)

echo moving cs file complete!

pause

bat脚本执行如图
3

工具二

名称:ProtobufPIDMapperTools

该工具是方便讲:协议ID与对应的Type一一对应起来

参数说明

  • ProtobufPIDMapperTools.exe 是我们的批处理工具(相对目录或绝对目录都OK)
  • 参数1 指定包含.proto的文件(相对目录或绝对目录都OK)
  • 参数2 指定.cs文件输出的文件路径(相对目录或绝对目录都OK)
  • 参数3 指定参数2生成的.cs文件的namespace值

代码下载

https://pan.baidu.com/s/1X4mHlf8duaSIXrhETAgSag

具体代码,大家随便改,随便用吧。
错误方面,欢迎指正。

Bat结合两工具

具体在:解压包后的Usage目录下的:bat.bat

代码

ProtobufGenBatTool\ProtobufGenBatTool.exe -protoc_file ProtobufTools\protoc.exe -protogen_file ProtobufTools\ProtoGen.exe -proto_file_inputpath protos protos1 -cs_file_outputpath com/net/protobuf/msg -pause_on_complete false

ProtobufPIDMapperTools\ProtobufPIDMapperTools.exe com/net/protobuf/msg com/net/protobuf/promap/ProMap.cs com.net.protobuf.promap

执行效果截图

4

项目中使用

映射协议与TYPE的使用如下:

ProMap就是我们生成的代码

            var obj = Activator.CreateInstance(ProMap.getType(1));
            obj = Activator.CreateInstance(ProMap.getType(2));
            obj = Activator.CreateInstance(ProMap.getType(3));
            obj = Activator.CreateInstance(ProMap.getType(4));
            obj = Activator.CreateInstance(ProMap.getType(5));
            obj = Activator.CreateInstance(ProMap.getType(6));
            obj = Activator.CreateInstance(ProMap.getType(7));
            obj = Activator.CreateInstance(ProMap.getType(8));
            obj = Activator.CreateInstance(ProMap.getType(9));
            obj = Activator.CreateInstance(ProMap.getType(10));

另一种更优的解决方案

由于时间关系,所以目前先将就使用protogen.exe生成.cs。
如果时间允许的话,我建议大家可以去学习一下,protoc.exe生成的.protobin文件的数据格式。
然后在自己写一个对.protobin文件的解析、生成.cs文件的工具,将可最大限度的按自己的想法来定制.cs的内容。

猜你喜欢

转载自blog.csdn.net/linjf520/article/details/79554490