【发布时间】:2021-07-21 18:24:20
【问题描述】:
我正在使用 Grpc.Tools (2.38.1) 从包含一些服务定义的 Test.proto 文件生成 C# 类型和 gRPC 存根。
为此,我在项目的.csproj 文件中有以下内容:
<ItemGroup>
<Protobuf Include="**/*.proto" />
</ItemGroup>
一切正常:我的Test.proto 在我的项目的 obj/Debug 文件夹中编译为 Test.cs 和 TestGrpc.cs。它们中的类型可以从项目中的其他类型中引用。
但我也需要为服务创建一个 WCF 接口,所以我想我可以使用自定义 Protoc 插件生成它。所以我写了一个简单的Protoc插件,写出一个包含接口的TestWcf.cs文件。然后,我将此插件可执行文件放在名为protoc-gen-blah.exe 的路径上,并将.csproj 文件中的条目更新为:
<ItemGroup>
<Protobuf Include="**/*.proto" AdditionalProtocArguments="--blah_out=obj\Debug" />
</ItemGroup>
这会正确创建 C# 文件 TestWcf.cs,我的界面位于:fantasy。
问题是我在TestWcf.cs 中的接口不能被项目中的其他类型引用,除非我在项目中手动包含生成的文件:这与其他生成的文件无关。
虽然默认情况下项目中不包含任何文件——我必须启用“显示所有文件”才能看到它们——Test.cs 和 TestGrpc.cs 在解决方案资源管理器中旁边有箭头,可以展开它们揭示里面的类型。 TestWcf.cs 没有这个箭头。所以 Visual Studio 不知何故知道Test.cs 和TestGrpc.cs 是源代码文件。
有谁知道我需要做什么才能像其他两个文件一样被 Visual Studio 自动识别生成的文件?
我怀疑它与this part of the Grpc.Tools build target 有关,因为我注意到我的TestWcf.cs 文件也不包含在 Grpc.Tools 清理删除的文件中,但我不明白为什么它不考虑我的生成的文件为 C#。
当我构建时,这是 Protoc 调用:
D:\...\Src\packages\Grpc.Tools.2.38.1\tools\windows_x86\protoc.exe --csharp_out=obj\Debug ⤶
--plugin=protoc-gen-grpc=D:\...\Src\packages\Grpc.Tools.2.38.1\tools\windows_x86\grpc_csharp_plugin.exe ⤶
--grpc_out=obj\Debug --proto_path=D:\...\Src\packages\Grpc.Tools.2.38.1\build\native\include ⤶
--proto_path=. --dependency_out=obj\Debug\xxxx_Test.protodep --error_format=msvs --blah_out=obj\Debug ⤶
Test.proto
依赖文件如下所示:
obj\Debug/Test.cs \
obj\Debug/TestGrpc.cs \
obj\Debug/TestWcf.cs: Test.proto
谢谢。
【问题讨论】: