Newtonsoft. Json dynamici c исключение в Xamarin.Forms - только в IOS / Device / Release - PullRequest
1 голос
/ 28 января 2020

Мое приложение Xamarin.Forms создает исключение:

Microsoft.CSharp.Runtime-Binder.RuntimeBinderException: Невозможно применить индексирование с помощью [] к выражению типа "Newtonsoft. Json .Linq. Jobject "

Это происходит только в версии iOS, установленной на устройстве (либо Xamarin на моем устройстве, либо покупателями из Apple Store). Он отлично работает на Android (тот же код!), Также протестирован на iOS Симуляторе, как отладка, так и выпуск - отлично работает.

Код здесь (2-я строка выбрасывает):

dynamic json = JObject.Parse(message);
long time = (long)(json["timestamp"]);

Есть идеи? Может быть, какой-то оптимизатор режима релиза удаляет то, что не должно быть удалено?

Спасибо

1 Ответ

2 голосов
/ 28 января 2020

Из документации Xamarin. iOS

Поскольку ядро ​​iOS не позволяет приложению динамически генерировать код, Xamarin. iOS не поддерживает никакие формы динамического c генерации кода.

Согласно этой записи в блоге это включает использование типа dynamic. По причинам (которые не обязательно важны для объема этого ответа).

Причина, по которой он запускается на симуляторе, состоит в том, что на самом деле симулятор не запускает iOS (не эмулятор), а скорее является Слой GUI, расположенный поверх macOS, на котором разрешено динамическое генерирование кода c.

Однако JObject определяет индексатор для доступа к значениям, содержащимся в JSON строка, следовательно, вам вообще не нужен dynamic, но вы можете заменить его на var в данном контексте

var json = JObject.Parse(message);
long time = (long)(json["timestamp"]);

Таким образом, ваша переменная json является статически типизированной JObject, что разрешается во время компиляции, следовательно, нет никакой динамической c генерации кода, которая завершится с ошибкой iOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...