MessagePack.Generator(MPC)で発生するエラーを解決する
2022/05/23 23:51 | 公開 |
2022/11/28 10:41 | シェル出力の内容が中途半端な位置で改行されていたのを修正 |
確認環境
- macOS Big Sur(11.6.4)
mpc
2.3.85
- dotnet sdk
5.0.408
UnityでMessagePackを使用するときにIL2CPPビルドを行おうとするとMessagePack.Generatorによる事前コード生成が必要になります。
リポジトリのREADMEの通りに行うとエラーが発生し、解決までに時間がかかったため私が解決した方法を書いておきます。
実行したコマンドとエラー内容
dotnet tool install --global MessagePack.Generator
でmpc
をインストールし
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
で問題なく実行できました。