「gRPC」での通信のために、Unityに導入の際に以下の様なエラーが発生!
Error: Could not load signature of Google.Protobuf.ByteString:get_Span due to: Could not load file or assembly 'System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. assembly:System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 type:<unknown type> member:(null) signature:<none>
Unloading broken assembly Assets/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll, this assembly can cause crashes in the runtime
その解決までを書きます。
環境
- Unity 2019.4.10f1
- grpc_unity_package.2.33.0-dev
- macOS 10.14.6
gRPC導入
以下のサイトを参考にUnityでgRPCを使えるようにしました。
gRPCとProtocol Buffersによるアプリケーション間通信 / Unity
すると、Grpc.Toolsとgrpc_unity_packageを追加し、最新のGoogle.Protobuf.dllに上書きした後、
Unityを開くと、Consoleに冒頭に記載したエラーがでました。
エラー内容
同様のエラーはネット上にもあがっており、
Google.Protobuf.dllはversion4.0.1.0 (4.5.2)のSystem.Memory参照してるけど、
Grpc.Coreはversion 4.0.1.1 (4.5.3)のSystem.Memoryを参照してるぞというエラーらしい。
https://github.com/grpc/grpc/issues/21908
grpc_unity_package.2.26.0-devとUnity2019.3.9f1では上手くいくという情報もありましたが、
私のとろこでは駄目でした。
解決策
Google.Protobuf.dllも4.5.3を参照するように変更することで解決できました。
-
dotnetコマンドを使えるようにする
https://dotnet.microsoft.com/download -
google protobuf sourceを落としてくる
https://github.com/protocolbuffers/protobuf -
フォルダ内の以下を開き、System.MemoryのVersionを4.5.3に変更
csharp/src/Google.Protobuf/Google.Protobuf.csproj
<PackageReference Include="System.Memory" Version="4.5.3" />
-
ターミナルで以下に移動
csharp/src/Google.Protobuf
-
コマンド叩く
dotnet publish -c Release -f net45
-
以下にGoogle.Protobuf.dllが作成される
csharp/src/Google.Protobuf/bin/Release/net45
-
作成されたGoogle.Protobuf.dllをUnity内に展開したgrpc_unity_packageの以下のGoogle.Protobuf.dllと入れ替える
Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll