C# .NET 5:找不到导入或存在错误

C# .NET 5:找不到导入或存在错误,c#,visual-studio-2019,grpc,.net-5,C#,Visual Studio 2019,Grpc,.net 5,从著名的介绍性示例()派生的简单场景。为了使HelloRequest消息可重用,我在另一个文件–request.proto中提取了它。该文件与原始文件greet.proto位于同一文件夹中(请参见最后的图片) 我需要使HelloRequest(在request.proto中)为迎宾服务(在greet.proto中)所知。在greet.proto中导入它的所有尝试都失败,并显示消息 ... 1>Protos/greet.proto(7,1): error : Import "req

从著名的介绍性示例()派生的简单场景。为了使
HelloRequest
消息可重用,我在另一个文件–request.proto中提取了它。该文件与原始文件greet.proto位于同一文件夹中(请参见最后的图片)

我需要使
HelloRequest
(在request.proto中)为
迎宾服务(在greet.proto中)所知。在greet.proto中导入它的所有尝试都失败,并显示消息

...
1>Protos/greet.proto(7,1): error : Import "request.proto" was not found or had errors.
...
这是greet.proto

syntax = "proto3";

option csharp_namespace = "GrpcService1";

package greeter;

import "request.proto";
//import "Protos/request.proto";
//import "GrpcService1/Protos/request.proto";
// all other combinations I may have thought off...

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
/*message HelloRequest {
  string name = 1;
}*/

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}
和request.proto:

syntax = "proto3";

package greeter;  // needles to say this was commented out in all my attempts

message HelloRequest {
  string name = 1;
}
package common;

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}
以下是解决方案资源管理器显示的内容:

正如我所料,答案和问题一样简单–这只是一个幸运的猜测–导入应该如下所示

import "protos/request.proto";
显然protobuf编译器“认为”它在项目的根文件夹中运行。这是有道理的

还有一个注意事项–如果导入的文件定义了一个新的包名称,则该名称应以消息名称为前缀,如下所示:

request.proto:

syntax = "proto3";

package greeter;  // needles to say this was commented out in all my attempts

message HelloRequest {
  string name = 1;
}
package common;

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}
并在greet.proto中使用它:

package greet;

import "protos/request.proto";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (common.HelloRequest) returns (HelloReply);
}
注意common.HelloRequest中的common

这一简单的观察结果引出了一个更一般的问题(可能是一个更重要的问题)

如何导入另一个项目中定义的protos,比如CustomTypes.csproj,以便在许多gRPC protobuf IDL中(重新)使用?

我对此没有答案——太多了(


如果有人知道,请把它贴在这里。我很乐意投赞成票。

正如我所料,答案和问题一样简单—这只是一个幸运的猜测!——导入应该是这样的

import "protos/request.proto";
显然protobuf编译器“认为”它在项目的根文件夹中运行。这是有道理的

还有一个注意事项–如果导入的文件定义了一个新的包名称,则该名称应以消息名称为前缀,如下所示:

request.proto:

syntax = "proto3";

package greeter;  // needles to say this was commented out in all my attempts

message HelloRequest {
  string name = 1;
}
package common;

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}
并在greet.proto中使用它:

package greet;

import "protos/request.proto";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (common.HelloRequest) returns (HelloReply);
}
注意common.HelloRequest中的common

这一简单的观察结果引出了一个更一般的问题(可能是一个更重要的问题)

如何导入另一个项目中定义的protos,比如CustomTypes.csproj,以便在许多gRPC protobuf IDL中(重新)使用?

我对此没有答案——太多了(

如果有人知道,请把它贴在这里。我很乐意投赞成票