为啥 Google.Pubsub.V1 beta01 不适用于 dotnet cli 项目?

Posted

技术标签:

【中文标题】为啥 Google.Pubsub.V1 beta01 不适用于 dotnet cli 项目?【英文标题】:Why does Google.Pubsub.V1 beta01 not work with dotnet cli projects?为什么 Google.Pubsub.V1 beta01 不适用于 dotnet cli 项目? 【发布时间】:2016-11-15 21:31:21 【问题描述】:

我创建了一个非常简单的程序,它应该列出 Google Cloud 项目中可用的主题。代码很简单:

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 的“常规”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 为目标,所以不应该支持吗?

【问题讨论】:

(作为一个简短的旁注,我提出这个问题的主要原因是创建google-cloud-dotnet 标记,作为我们的 Google Cloud .NET 客户端库客户的中心标记。但我希望这个无论如何很可能会自然而然地出现......) 【参考方案1】:

这是当前 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\0.15.0\build\native\bin\windows_x64\grpc_csharp_ext.dll bin\Debug\net45\win7-x64\nativelibs\windows_x64

... 但这显然很繁琐。我建议在根本问题得到解决之前只使用 msbuild。

【讨论】:

我猜对于dotnet,如果包结构稍作更改,那么在 dotnet 发布期间将复制正确的库,并且 LoadLibrary/DllImport 应该按照搜索顺序选择它们。我为 RC1 blog.3d-logic.com/2015/11/10/… 写了一篇博文,如果使用这篇博文中描述的包结构,现在加载原生依赖项的工作方式会有所不同。 @Pawel:我已经设法让它在本地工作......我只需要整理一下。 @Jon Skeet.. 如何解决您的问题。能详细说明一下吗 @Sujatha:这个答案很老了;现在不需要解决方法。如果您仍有问题,请提出一个新问题。

以上是关于为啥 Google.Pubsub.V1 beta01 不适用于 dotnet cli 项目?的主要内容,如果未能解决你的问题,请参考以下文章

从 GCP 发布/订阅中捕获错误代码

Atom 1.25.0 和 1.26.0 beta0 发布,文本编辑器

Cocos2d-x3.3beta0创建动画的3种方式

matlab自定义函数拟合

matlab中如何拟合光滑曲线

计算平均值的95%置信区间