LoginSignup
2
1

More than 1 year has passed since last update.

UnityのMessagePack for C#でCodeGenerator動かない時の対応方法

Last updated at Posted at 2021-05-27

結論

暫定的には、.Net core sdk の3.1系を入れて、global.jsonをAssetsフォルダに追加しよう。
将来的には、MessagePack for C#ライブラリのアップデートを検討しよう。

原因

MessagePack for C#のCodeGeneratorは .Net core sdkの3.1系を前提に作られている。
しかし、.Net core sdkの最新は5.0系であり、またdotnet系コマンドは最新版を優先的に使おうとしてしまうせいでエラーが発生する。
エラー内容はこんな感じ(検索に引っかかるように記載)

Project Compilation Start:Assembly-CSharp
failed to get metadata of System.Threading.Tasks.Task`1
failed to get metadata of System.Threading.Tasks.Task
Fail in console app running on MessagepackCompiler.RunAsync
System.InvalidOperationException: failed to get metadata of MessagePack.MessagePackObjectAttribute
   at MessagePackCompiler.CodeAnalysis.ReferenceSymbols..ctor(Compilation compilation, Action`1 logger) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeAnalysis\TypeCollector.cs:line 58
   at MessagePackCompiler.CodeAnalysis.TypeCollector..ctor(Compilation compilation, Boolean disallowInternal, Boolean isForceUseMap, String[] ignoreTypeNames, Action`1 logger) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeAnalysis\TypeCollector.cs:line 280
   at MessagePackCompiler.CodeGenerator.GenerateFileAsync(Compilation compilation, String output, String resolverName, String namespace, Boolean useMapMode, String multipleIfDirectiveOutputSymbols, String[] externalIgnoreTypeNames) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeGenerator.cs:line 61
   at MessagePack.Generator.MessagepackCompiler.RunAsync(String input, String output, String conditionalSymbol, String resolverName, String namespace, Boolean useMapMode, String multipleIfDirectiveOutputSymbols, String[] externalIgnoreTypeNames) in D:\a\1\s\src\MessagePack.Generator\MessagepackCompiler.cs:line 65
   at ConsoleAppFramework.ConsoleAppEngine.RunCore(ConsoleAppContext ctx, Type type, MethodInfo methodInfo, String[] args, Int32 argsOffset)

既にこの問題は認知されており、現時点ではアルファですが対応版もリリースされてはいます。
https://github.com/neuecc/MessagePack-CSharp/releases/tag/v2.3.58-alpha

なので、将来的にはライブラリのアップデートで完結する話なわけですが、
まだアルファだから導入したくない OR 都合上アプデできない、という人向けの対応が今回の話です。

暫定対応

導入済みSDK確認

まず自分のローカル環境を確認するため、コマンドプロンプトで下記を実行してください。

dotnet --list-sdks

これで3.1系が入ってるなら問題ないんですが、入ってない場合はインストールする必要があります。

.Net core sdk 3.1系インストール

Build apps - SDKの最新をインストールしてください。
インストール後、コマンドプロンプト再起動して、導入できたか確認しておくと良いと思います。

Assetsフォルダ下に global.json を追加

global.json
{
  "sdk": {
    "version": "3.1.0",
    "rollForward": "latestFeature"
  }
}

設定項目詳細は上の記事を読んでください。
簡潔に説明すると、3.1.xxx に該当する.Net core SDKを使うよって指定です。
チーム開発だと、PCごとに入ってるバージョン違ったりすると思うので、こうしました。
(※可能であれば揃えたほうが良いとは思います)

とりあえず自分の環境ではこれで動きました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1