blockの巣

MessagePack.Generator(MPC)で発生するエラーを解決する

2022/05/23 23:51 公開
2022/11/28 10:41

シェル出力の内容が中途半端な位置で改行されていたのを修正

C# MessagePack Unity

確認環境


UnityでMessagePackを使用するときにIL2CPPビルドを行おうとするとMessagePack.Generatorによる事前コード生成が必要になります。
リポジトリのREADMEの通りに行うとエラーが発生し、解決までに時間がかかったため私が解決した方法を書いておきます。

実行したコマンドとエラー内容

dotnet tool install --global MessagePack.Generatormpcをインストールし
Unityのプロジェクトのルートフォルダで
mpc -i "./Assembly-CSharp.csproj" -o "./Assets/Generated/MessagePackGenerated.cs"を実行しました。 READMEとはinputとoutputが異なりますがcsprojを指定し書き出し先のファイルを指定しているという点は同じです。

すると

__________________________________________________
Project "/UnityProjectPath/Assembly-CSharp.csproj" (Compile;CoreCompile target(s)):

/usr/local/share/dotnet/sdk/5.0.408/Microsoft.Common.CurrentVersion.targets(1217,5): error MSB3644: The reference assemblies for .NETFramework,Version=v4.7.1 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks
Done building project "Assembly-CSharp.csproj" -- FAILED.

のようなエラーがcsprojの数出たあとに

Project Compilation Start:Assembly-CSharp
failed to get metadata of System.Threading.Tasks.Task`1
failed to get metadata of System.Threading.Tasks.Task
failed to get metadata of System.Runtime.Serialization.IgnoreDataMemberAttribute
Project Compilation Complete:00:00:02.4197641
Method Collect Start
Fail in console app running on MessagepackCompiler.RunAsync
System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at MessagePackCompiler.CodeAnalysis.TypeCollector.GetObjectInfo(INamedTypeSymbol type) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeAnalysis\TypeCollector.cs:line 586
   at MessagePackCompiler.CodeAnalysis.TypeCollector.CollectObject(INamedTypeSymbol type) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeAnalysis\TypeCollector.cs:line 580
   at MessagePackCompiler.CodeAnalysis.TypeCollector.CollectCore(ITypeSymbol typeSymbol) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeAnalysis\TypeCollector.cs:line 381
   at MessagePackCompiler.CodeAnalysis.TypeCollector.Collect() in D:\a\1\s\src\MessagePack.GeneratorCore\CodeAnalysis\TypeCollector.cs:line 301
   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 64
   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)

というエラーが出て失敗しました。

dotnetのバージョンを変更してもmpcのインストールをローカルで試してもグローバルで試してもだめでした。

解決方法

mpc -i "./" -o "./Assets/Generated/MessagePackGenerated.cs" のようにcsprojを指定せずにディレクトリを指定することで解決しました。

ちなみにREADMEには.NET Core 3 Runtimeを使用するように書かれていますがReleaseの内容を見るに.Net5でも大丈夫だと思います。 私はdotnet sdk 5.0.408で問題なく実行できました。