【发布时间】:2021-04-15 17:57:46
【问题描述】:
用例非常简单: 我有两个项目(ProtoProvider 和 ProtoConsumer)。
ProtoProvider 有 proto 文件 (to_import.proto) 和我想在 ProtoConsumer 上使用的消息。
ProtoConsumer 对 ProtoProvider 有一个引用,并尝试在imported.proto 中使用ProvidedMessage。
我无法使用该消息,因为我收到“找不到文件”。在 import.proto 的编译器上导入和“ProvidedMessage 未定义”。
EDIT2>>>
为了澄清我想创建一个像谷歌的 google.protobuf.Timestamp 这样的消息并将其分发到另一个项目或没有其他项目的项目,同时让项目/项目(消费者)从 dll 获取消息。问题的整个前提是如何通过dll在另一个项目中使用to_import.proto中定义的消息(将其视为common.grpc lib)。
是否有允许从项目引用中导入 proto 文件的解决方案? 我正在寻找类似谷歌的知名类型解决方案
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
来源:https://developers.google.com/protocol-buffers/docs/csharptutorial#where-to-find-the-example-code.
(复制原始文件或移动文件不是一个优雅的解决方案)。
下面我将提供 .csproj 文件
ProtoProvider:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None Remove="to_import.proto" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.27.0" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="to_import.proto" GrpcServices="None" />
</ItemGroup>
</Project>
原始消费者:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Protobuf Include="Protos\imported.proto" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.27.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ProtoProvider\ProtoProvider.csproj" />
</ItemGroup>
</Project>
编辑>>3 一些上下文:这个问题的目的是帮助我理解一种更清晰的方式来实现小数一次(如指定here)并在每个项目中重用它们。
【问题讨论】:
-
我不明白你的问题。提供者和消费者可以使用相同的
proto文件。您声明您的消息并编译为本机代码。您导入的本机代码。我不明白您搜索“知名”类型。 -
所以在构建时您没有收到 File not found 错误?我正在使用错误消息更新原始帖子
-
我没有使用 C#,但我现在明白了。您是否检查过您的导入语法以确保它是正确的(包名称等)?您的 csharp 命名空间不包含“common”。
-
这就是我感兴趣的发现,如何正确导入。我尝试了许多不同的包+原型文件名、包+类名、命名空间+原型文件名和命名空间+类名的组合。所有这些都会导致找不到文件错误。
-
如果 C# 环境与 Java 环境完全一样,
csharp_namespace应该是完全限定路径名的前缀/路径/目录,而不是ProtoConsumer。你看到这个了吗? stackoverflow.com/questions/64547422/…
标签: .net-core grpc proto protocol-buffers