新版步移
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对字符串处理,还有代码语法、可读性、方便程度、等,都没有高级语言方便
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脚本执行如图
名称: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
执行效果截图
映射协议与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的内容。