結論
暫定的には、.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 を追加
{
"sdk": {
"version": "3.1.0",
"rollForward": "latestFeature"
}
}
設定項目詳細は上の記事を読んでください。
簡潔に説明すると、3.1.xxx に該当する.Net core SDKを使うよって指定です。
チーム開発だと、PCごとに入ってるバージョン違ったりすると思うので、こうしました。
(※可能であれば揃えたほうが良いとは思います)
とりあえず自分の環境ではこれで動きました。