20

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 プロジェクトからこれを実行すると、正常に動作します。次のproject.jsonファイルで dotnet cli (1.0.0-preview2-003121) を使用しようとすると:

{
  "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 をターゲットにしようとしているわけではないので、これはサポートされるべきではありませんか?

4

1 に答える 1

15

これは現在、Google.Pubsub.V1 が RPC トランスポートとして使用する gRPC 0.15 の制限です。msbuild の下build/net45/Grpc.Core.targetsでは、パッケージ内のファイルがGrpc.Coreすべてのネイティブ バイナリを適切な場所にコピーします。DNX では、パッケージはコピーされず、gRPC はローカル パッケージ リポジトリの適切な場所でファイルを検索しようとします。dotnet cli では、パッケージ内の "runtimes" ルート ディレクトリを使用してライブラリをホストする必要があります。

これに対する修正を 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 のみを使用することをお勧めします。

于 2016-07-13T10:34:21.067 に答える