Protobuf 从另一个 proto C# 项目导入消息

Posted

技术标签:

【中文标题】Protobuf 从另一个 proto C# 项目导入消息【英文标题】:Protobuf Importing Message from another proto C# projects 【发布时间】:2020-09-07 08:05:23 【问题描述】:

我在 C# .NET Standard 项目 MyProject 中使用 Google.Protobuf.Tools。我有多个原型定义。

MyProject/Protos/Requests/SampleRequest.proto

syntax = "proto3";

option csharp_namespace = "My.Projects.Protos.Requests";


package sampleRequests;

message SampleRequest 
   int32 requestNumber =1;
   SubRequest request =2;



MyProject/Protos/Requests/SubRequest.proto

syntax = "proto3";

option csharp_namespace = "My.Projects.Protos.Requests";

package subRequests;

message SubRequest 
   int32 SubId =1;
   string requestText =2;



现在,这段代码无法编译,显示的错误是 SubRequest is unknown。

我想知道如何导入不同的 proto 文件,以便实现这一点。我不太了解--proto_path cli 选项,也找不到任何明确的文档。

非常感谢任何帮助。提前致谢。 提前致谢。

【问题讨论】:

【参考方案1】:

评估导入时,会针对每个--proto_path 对其进行测试,以查看是否可以找到合适的匹配项。例如,您可以将文件并排放置在 Requests 文件夹中,使用 --proto_path 给出 Protos 文件夹的位置,然后在 proto 中相对于那里进行对话:

import "Requests/SubRequest.proto";

还要注意,您需要考虑包;它们不在同一个包中,因此您可以通过以 . 开头来明确限定它:

syntax = "proto3";
import "Requests/SubRequest.proto";

option csharp_namespace = "My.Projects.Protos.Requests";


package sampleRequests;

message SampleRequest 
   int32 requestNumber =1;
   .subRequests.SubRequest request =2;

【讨论】:

--proto_path 是我需要做的事情还是编译器做的事情? 感谢您的回答。如果以上是我在使用 proto 处理 C# 项目时需要做的事情,请指导我查看某种文档 @JinsPeter 哪个编译器? --proto_path 实际上是 Google protobuf 架构编译器的一个参数,(又名“protoc”)所以如果你的意思是:是的。如果您使用的是 protobuf-net:它:可选的命令行工具(“protogen”)模仿“protoc”。 C# 编译器对 .proto 文件毫无兴趣。您可能在谈论构建加载项?如果是这样,您可能正在寻找github.com/grpc/grpc/blob/master/src/csharp/…?

以上是关于Protobuf 从另一个 proto C# 项目导入消息的主要内容,如果未能解决你的问题,请参考以下文章

protobuf 下载编译,拷贝,proto文件生成c# c++代码

protobuf 下载编译,拷贝,proto文件生成c# c++代码

protobuf 下载编译,拷贝,proto文件生成c# c++代码

用于 C# 的 Google Protobuf 3.0.0 程序集

protobuf-net - 反引号、字典和 .proto 文件

UnityProtobuf的使用与常见问题