Posted at

IL2CPPがマネージドライブラリのビルドでよく分からないエラーを出す

More than 1 year has passed since last update.

Unity 5.5.1fでiOS版をビルドしたところ、こんなエラーが出ました。


stdout:

IL2CPP error (no further information about what managed code was being converted is available)

Additional information: Build a development build for more information. Exception has been thrown by the target of an invocation.

il2cpp.exe didn't catch exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object

at Unity.IL2CPP.GenericsCollection.Inflater.ConstructGenericMethod (Unity.IL2CPP.GenericsCollection.GenericContext context, Mono.Cecil.TypeReference declaringType, Mono.Cecil.MethodDefinition method, IEnumerable`1 genericArguments) <0x10f7b04f0 + 0x00065> in :0

...


…ここからは「内部でエラーが出た」くらいしか分からない。

結局、バージョン管理でビルド失敗するようになった直前の差分を見て分かったんですが、使用しているマネージドライブラリのプロジェクトのプロパティの"対象のフレームワーク"がなぜか".NET Framework 4.5.2"に変えられていました。UnityというかMonoが対応しているのは3.5まで(バージョンによる)なので、こんなよく分からないエラーが出たものと思われます。

で、なぜこの問題が発生したのかというと、

プロジェクトを更新した人の環境にVisual Studio Tools for Unityがインストールされていなかった

からでした。これがインストールされていると"対象のフレームワーク"に"Unity 3.5 .net full Base Class Libraries"などが指定できるようになるんですが、インストールされていないと、VisualStudioが気を遣って勝手に適当なバージョンに変更してしまうようです。で、そのまま気付かずにSubmitしてしまったわけです。

それでもマネージドライブラリ自体のビルドは通りますし、UnityビルドでもEditorからビルドした場合はXcodeプロジェクトは生成されるので(もちろんコンソールにはエラーが出る)、"Build And Run"じゃなくて"Build"してXcodeでビルドする人だと気付かないこともあるかと思います。今回はJenkinsでコマンドラインビルドしたときに発見されたのでした。

なお、この原因以外でも似たようなエラーが出ることがあるようですが、その場合は


il2cpp.exe didn't catch exception:


以降に、存在しないAPIをコールしていたり、だいたい読めば分かるような内容が書かれているようです。今回は全く分かりませんでしたが…。