1 min read
25 Sep

Совсем недавно ко мне обратился коллега с просьбой помочь с ошибкой, когда json не мог распаковаться и падал с ошибкой примерно такой по смыслу:

"Не могу найти конструктор с передаваемыми параметрами", а стек показывает, что где-то там через рефлексию создается инстанс (через Activator) и при вызове конструктора чет все падает.

И тут знаете, как в шуточках за 300, люди делятся на несколько групп:

  • Неопытные с ужасом идут гуглить ошибку, ничего не находят, идут дергать вторую группу;
  • Более опытные понимают, что тут как-то не очень все тривиально, идут в место где рефлексией создается какой-то объект и пытаются понять как же можно было накосячить создателям плагина, что оно не работает;
  • Ну и такие как мы с вами, которые в принципе уже понимают, что билд скорее всего il2cpp, что рефлексия - это плохо, что il2cpp ничего об этом знать не знает, а значит проблема просто в том, что метода нет после компиляции.

К чему я это все. Для исправления подобных ситуаций, il2cpp нужно "подсказать", что существует метод (или конструктор), для чего я обычно делаю в проекте файл AOT.cs:

public static class AOT {
    [Preserve]
    public static void Dummy() {
       new SomeClass().Method(); // не вырезаем конструктор и метод из билда
       ...
    } 
} 

Т.е. мы никогда не вызываем этот метод, но при сборке эти методы будут добавлены.

Вообще это касается всех вызовов через reflection и когда в проекте не указывается вызов.

Comments
* The email will not be published on the website.