如何通过protoc.exe编译C++ 的Proto文件生成C#的.proto文件

博主分享了如何在Unity环境下使用protoc.exe工具批量生成.proto文件的步骤,包括下载proto编译器,组织proto文件,以及调用编译函数自动化生成C#可用的protobuf文件。通过此方法,可以避免手动处理每个.proto文件,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博主最近在使用谷歌框架的proto,想在unity下自动生成可用的.proto文件,进行轻量化传输。但不想自己去一个个的生成。所以,找了很多的办法,后来发现可以通过protoc.exe进行生成,但是只能单个命令行进行生成,无法批量编译出.proto文件。后来经过多方尝试,使用Unity框架可以很容易的批量生成proto文件。

一、下载.proto程序

从官网地址选择自己想要的版本,然后下下来放到Unity工程可访问的指定目录,例如:ProtoGen目录

二、将想要转换的proto所有文件打包放在一个文件夹下,注意有依赖 的一定要都放在文件夹下,避免转换时找不到定义的情况出现

三、调用编译函数,如果提示有错误自行解决,没有报错的话,就可以在对应的生成目录找到C#可用的对应的protobuff文件了。

具体代码如下:

public void GenProtoCSFile()
        {
            string protogen = Application.streamingAssetsPath + "/ProtoGen/protoc.exe";
            string protoDir = Application.streamingAssetsPath + "/ProtoGen/Proto";
            List<string> cmds = new List<string>();
            if (!Directory.Exists(protoDir))
            {
                Debug.LogError("不存在Proto文件夹 path:"+ protoDir);
                return;
            }
            DirectoryInfo folder = new DirectoryInfo(protoDir); // Proto所在路径
            FileInfo[] files = folder.GetFiles("*.proto", SearchOption.AllDirectories);
            Debug.LogError("protofile size:" + files.Length);
            string outDir = Path.Combine(Application.streamingAssetsPath, "AssetBundles") + "/ProtoGen/OutDir";
            if (!Directory.Exists(outDir)) // CSharp 输出路径
            {
                Directory.CreateDirectory(outDir);
            }
            foreach (FileInfo file in files)
            {
                string cmd = protogen + " --csharp_out=" + outDir + " -I " + protoDir + " " + file.FullName;
                cmds.Add(cmd);
            }
            Cmd(cmds);
            AssetDatabase.Refresh();
        }

        public void Cmd(List<string> cmds)
        {
            Process process = new Process();
            process.StartInfo.FileName = "cmd.exe";
            process.StartInfo.WorkingDirectory = ".";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardInput = true;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.RedirectStandardError = true;
            process.OutputDataReceived += OutputHandler;
            process.ErrorDataReceived += ErrorDataHandler;
            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            for (int i = 0; i < cmds.Count; i++)
            {
                process.StandardInput.WriteLine(cmds[i]);
            }
            process.StandardInput.WriteLine("exit");
            process.WaitForExit();
        }

        private void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
        {
            if (!string.IsNullOrEmpty(outLine.Data))
            {
                Debug.Log(outLine.Data);
            }
        }

        private void ErrorDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
        {
            if (!string.IsNullOrEmpty(outLine.Data) && !outLine.Data.Contains("warning:"))
            {
                Debug.LogError(outLine.Data);
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大侠后花园

如果觉得文章不错请给点支持吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值