为什么 Google.Pubsub.V1 beta01 不适用于 dotnet cli 项目?
Why does Google.Pubsub.V1 beta01 not work with dotnet cli projects?
我创建了一个非常简单的程序,它应该列出 Google 云项目中可用的主题。代码很简单:
using System;
using Google.Pubsub.V1;
public class Test
{
static void Main()
{
var projectId = "(fill in project ID here...)";
var projectName = PublisherClient.FormatProjectName(projectId);
var client = PublisherClient.Create();
foreach (var topic in client.ListTopics(projectName))
{
Console.WriteLine(topic.Name);
}
}
}
当我从一个针对 .NET 4.5 的 "regular" msbuild 项目 运行 时,它工作正常。当我尝试将 dotnet cli (1.0.0-preview2-003121) 与以下 project.json
文件一起使用时:
{
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Google.Pubsub.V1": "1.0.0-beta01"
},
"frameworks": {
"net45": { }
}
}
...我看到一个例外:
Unhandled Exception: System.IO.FileNotFoundException: Error loading native library.
Not found in any of the possible locations c:\[...]\Pubsub.Demo\bin\Debug\net45\win7-x64\nativelibs\windows_x64\grpc_csharp_ext.dll
at Grpc.Core.Internal.UnmanagedLibrary.FirstValidLibraryPath(String[] libraryPathAlternatives)
at Grpc.Core.Internal.UnmanagedLibrary..ctor(String[] libraryPathAlternatives)
at ...
我没有尝试以 .NET Core 为目标,所以这不应该受到支持吗?
这是目前 gRPC 0.15 中的一个限制,Google.Pubsub.V1 将其用作其 RPC 传输。在 msbuild 下,Grpc.Core
包中的 build/net45/Grpc.Core.targets
文件将所有本机二进制文件复制到位。在 DNX 下,包未被复制,gRPC 尝试使用本地包存储库在正确的位置查找文件。在 dotnet cli 下,我们需要使用包中的 "runtimes" 根目录来托管库。
我们已经 implemented a fix for this in gRPC,但我们未能将其纳入 beta-01 版本。我们希望为 beta-02 修复它。
可以通过手动复制文件来解决此问题:
mkdir bin\Debug\net45\win7-x64\nativelibs\windows_x64
copy \users\jon\.dnx\packages\Grpc.Core[=10=].15.0\build\native\bin\windows_x64\grpc_csharp_ext.dll bin\Debug\net45\win7-x64\nativelibs\windows_x64
...但这显然很繁琐。我建议只使用 msbuild,直到根本问题得到解决。
我创建了一个非常简单的程序,它应该列出 Google 云项目中可用的主题。代码很简单:
using System;
using Google.Pubsub.V1;
public class Test
{
static void Main()
{
var projectId = "(fill in project ID here...)";
var projectName = PublisherClient.FormatProjectName(projectId);
var client = PublisherClient.Create();
foreach (var topic in client.ListTopics(projectName))
{
Console.WriteLine(topic.Name);
}
}
}
当我从一个针对 .NET 4.5 的 "regular" msbuild 项目 运行 时,它工作正常。当我尝试将 dotnet cli (1.0.0-preview2-003121) 与以下 project.json
文件一起使用时:
{
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Google.Pubsub.V1": "1.0.0-beta01"
},
"frameworks": {
"net45": { }
}
}
...我看到一个例外:
Unhandled Exception: System.IO.FileNotFoundException: Error loading native library.
Not found in any of the possible locations c:\[...]\Pubsub.Demo\bin\Debug\net45\win7-x64\nativelibs\windows_x64\grpc_csharp_ext.dll
at Grpc.Core.Internal.UnmanagedLibrary.FirstValidLibraryPath(String[] libraryPathAlternatives)
at Grpc.Core.Internal.UnmanagedLibrary..ctor(String[] libraryPathAlternatives)
at ...
我没有尝试以 .NET Core 为目标,所以这不应该受到支持吗?
这是目前 gRPC 0.15 中的一个限制,Google.Pubsub.V1 将其用作其 RPC 传输。在 msbuild 下,Grpc.Core
包中的 build/net45/Grpc.Core.targets
文件将所有本机二进制文件复制到位。在 DNX 下,包未被复制,gRPC 尝试使用本地包存储库在正确的位置查找文件。在 dotnet cli 下,我们需要使用包中的 "runtimes" 根目录来托管库。
我们已经 implemented a fix for this in gRPC,但我们未能将其纳入 beta-01 版本。我们希望为 beta-02 修复它。
可以通过手动复制文件来解决此问题:
mkdir bin\Debug\net45\win7-x64\nativelibs\windows_x64
copy \users\jon\.dnx\packages\Grpc.Core[=10=].15.0\build\native\bin\windows_x64\grpc_csharp_ext.dll bin\Debug\net45\win7-x64\nativelibs\windows_x64
...但这显然很繁琐。我建议只使用 msbuild,直到根本问题得到解决。