Запрос XElement в приложении Xamarin для Android

#linq #xamarin #xelement

#linq #xamarin #xelement

Вопрос:

Метод, который я использовал для запроса XElement, работает в Windows, но не в Xamarin Android:

 using System.Xml;
using System.Xml.Linq;
using System.Linq;

    public string ValidateLicense()
    {
        XElement xEl;
        string sMessage;
        Model.clsWebServiceFunctions cSvc = new Model.clsWebServiceFunctions();

        sMessage = cSvc.QueryWEB_ValidateLicense();
        xEl = cSvc.ServiceGetData(clsSettings.LicensingUrl, sMessage);

        var vResult = from results in xEl.DescendantsAndSelf("Result")
                      select results;

        return vResult.First().Element("LicensingResult").Value;
    }
  

Сообщение, которое я получаю, является

Метод 'First' not found in type ‘IEnumerable’1’

Похоже, это связано с тем, что Xamarin не поддерживает этот метод?!

У меня много похожих запросов в моем приложении, так что может кто-нибудь порекомендовать альтернативу, которая будет работать в Xamarin? Я мог бы предложить это, но не знаю хорошего решения.

Комментарии:

1. Это должно сработать. Вы получаете ошибку сборки или ошибку времени выполнения?

2. Это ошибка времени выполнения. Он отлично компилируется и работает в моем тестовом приложении Windows.

3. есть ли у вас система. Ядро включено в ваши ссылки?

4. Да, я это проверил. В настоящее время похоже, что Xamarin не поддерживает этот метод, поэтому я действительно ищу альтернативный метод для запроса этого XML

Ответ №1:

У меня аналогичная проблема на iOS.

Похоже, это проблема с тем, что методы расширения Linq для IEnumerable не загружаются.

Ошибка возникает в MvvmCross, который предназначен для работы с мобильными платформами, поддерживаемыми Xamarin. Проблема изначально не возникает при развертывании нового приложения, для манифестации требуется некоторое время, т. Е. требуется несколько дней разработки, попытка повторного запуска на симуляторе.

Поэтому я считаю, что это проблема с привязкой к Xamarin. [Редактировать]: Больше нет, см. Ниже.

http://forums.xamarin.com/discussion/19483/pcl-linq-problem-on-ios-vs2013-sp2 — Здесь пока нет ответов.

[Редактировать] Хорошо, итак, я ссылался на библиотеку DLL NET FX 3.5. изменение ссылочной сборки на NET 4.0, казалось, решило проблему. Обратите внимание, что в выходных данных приложения вы можете увидеть это при запуске. Это плохо:

 Loaded assembly: /Users/mike/Library/Caches/Xamarin/mtbs/builds/XamTestTouch2/7da682ee-1ab5-4b07-b745-c3c558a10329/assemblies/System.Core.dll [External]
  

Это хорошо:

 Loaded assembly: /Developer/MonoTouch/usr/lib/mono/2.1/System.Core.dll [External]
  

Возможно, потребуется удалить кэши /Xamarin /mtbs /builds/AppName /guid00-00000-0000.. папка после исправления ваших ссылок, чтобы все снова заработало.

Комментарии:

1. Я не тестировал это, поскольку я отошел от Xamarin из-за такого рода проблем. Спасибо за ответ, и я надеюсь, что это будет полезно кому-то еще.

2. Спасибо за положительный отзыв. Что вы используете вместо Xamarin? Мне пришлось потратить несколько недель на то, чтобы заставить вещи работать на всех платформах, но я все еще думаю, что это того стоит.

3. Я перешел на машинный код. Я хотел использовать Xamarin для повторного использования кода, но поскольку мне пришлось переписать весь мой синтаксический анализ данных, чтобы обойти вышеупомянутую проблему, это не принесло достаточной пользы для такого простого проекта, и если бы я застрял на следующем (гораздо более сложном) проекте, тогда у меня могли бы быть реальные проблемы. По крайней мере, с машинным кодом есть много помощи.

4. Я понимаю, к чему вы клоните. Я немного поиграл, чтобы выработать волшебную формулу, которая работает. Кажется, что в реализациях mono есть все необходимое, это просто проверки ссылок во время компиляции, которые все портят. Это означает несколько интерфейсных классов здесь и там, чтобы заставить все работать. Удачи, Джеймс.

5. @MichaelRibbons где мне установить эти ссылки на сборку? Ссылка на System. Ядро уже существует в проекте iOS. Код отлично работает в Android, но выдает исключение в iOS.