CsvHelper под Xamarin.Android выдает MissingMethodException
Решение под Xamarin, конечные модули на UWP и Android. Задача: спарсить csv и использовать данные. Для парсинга была просьба использовать библиотеку CsvHelper. Реализовал по докам: настроил маппинг, конвертацию, где требовалось: запускаю в UWP — всё отлично работает, данные корректно спарсились, корректно замаппились. Казалось бы, сказка!
Однако при попытке запустить аналогичный код под Android отхватил сначала:
System.MissingMethodException: 'Constructor 'CsvHelper.Configuration.MemberMap`2[[SampleBrowser.SfChat.DataModelWrapper, SampleBrowser.SfChat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.String, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.Reflection.RuntimePropertyInfo)' was not found.'
А когда переделал всё с нормального маппинга на атрибуты и ручной "ремап" из строк в нужные типы, то:
System.MissingMethodException: 'Constructor 'CsvHelper.Configuration.DefaultClassMap`1[[SampleBrowser.SfChat.DataModelWrapper, SampleBrowser.SfChat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]()' was not found.'
Кто-нибудь общался с CsvHelper? Сталкивался? А с Xamarin? Подозреваю, что у меня ещё и что-то с самим проектом случилось, т.к. первоначально в отладчике андроида удавалось дойти до строки
csv.Context.RegisterClassMap<DataModelWrapperMap>();
А теперь внутрь я вообще не проваливаюсь: падаю на создании инстанса приложения. Причём отладка UWP работает исправно (в разных IDE правда запускаю UWP и Андроид). Удалял выходные каталоги, клин, ребилд и т.п.: бестолку, перестал дебажить, сразу валится с одной из вышеописанных ошибок, в зависимости от версии запускаемого кода (с маппингом или без).
P.S. Вся движуха происходит в конструкторе — может в этом и проблема? Попробую всё это дело разлепить, вдруг починится...
Ответы (1 шт):
Нагуглил похожую проблему в юнити, но там открестились тем, что это юнити виноват и предложили использовать ручной вариант парсинга и заглушить инстанциирование маппера таким образом:
ObjectResolver.Current = new ObjectResolver(type => true, (type, args) => null);
Документация по ручному чтению: https://joshclose.github.io/CsvHelper/examples/reading/reading-by-hand/
Для меня это сработало. Хотя первоначальный вариант был сильно красИвее =)