Protobuf-net в UWP/.NET Native и iOS

У меня есть приложение Xamarin.Forms на основе .NET Standard 1.4, которое использует protobuf-net для хранения объектов в базе данных, которые будут отправлены в службу WCF позднее.

На Android и UWP "управляемый" все работает нормально, но - после поиска в репозиториях, статьях и сообщениях в блогах, к которым больше нет доступа, а также после попытки заставить инструмент прекомпиляции работать, но при этом безуспешно - у меня есть один простой (вероятно, не) вопрос: как заставить protobuf-net работать в «ограниченных» средах, таких как UWP/.NET Native и iOS/Xamarin?


person EaranMaleasi    schedule 06.12.2017    source источник
comment
Мне удалось сделать это один раз для приложения Xamarin\IOS (не для форм, но это не имеет значения). Это было непросто, и я действительно использовал инструмент предварительной компиляции. К сожалению, сейчас у меня нет доступа к этой кодовой базе, просто чтобы вы знали, что это возможно.   -  person Evk    schedule 06.12.2017
comment
Я знаю, что это должно быть возможно, но я не могу понять, как :(   -  person EaranMaleasi    schedule 06.12.2017
comment
То же самое здесь, я использовал protobuf-net на iOS, но не настраивал его для проекта и больше не имел доступа к коду. Вы читали этот ответ?   -  person Paul Kertscher    schedule 06.12.2017
comment
Да, но моя проблема в том, что я не могу скомпилировать проект для инструмента предварительной компиляции. Также любые ссылки на его блог мертвы.   -  person EaranMaleasi    schedule 06.12.2017
comment
Ссылки на блоги @EaranMaleasi должны работать нормально - какие-то конкретные вещи, которые являются 404?   -  person Marc Gravell    schedule 07.12.2017
comment
@MarcGravell Firefox и Chorme (на разных машинах) сообщают мне, что соединение было закрыто при загрузке веб-сайта. Chrome специально говорит ERR_CONNECTION_CLOSED. Все плагины (например, Adblock, Noscript и т. д.) отключены.   -  person EaranMaleasi    schedule 07.12.2017
comment
@EaranMaleasi отлично: какой URL вы используете?   -  person Marc Gravell    schedule 07.12.2017
comment
@MarcGravell Я использую https://blog.marcgravell.com, но я только что проверил его с помощью chorme на своем мобильном телефоне, который отлично работает. Затем я использовал точку доступа для подключения машины через свой телефон к Интернету, и она также загружалась. Похоже, это внутренняя проблема.   -  person EaranMaleasi    schedule 07.12.2017
comment
@EaranMaleasi да, я вижу трафик на это, так что если есть проблема: это не везде   -  person Marc Gravell    schedule 07.12.2017
comment
@EaranMaleasi, а как насчет реализации Google протокольных буферов в С#?   -  person Ashkan Nourzadeh    schedule 07.12.2017


Ответы (1)


Сейчас у меня нет отличного решения для этого сценария. Я знаю, что некоторые люди заставили это работать, но я недостаточно разбираюсь в UWP / Native / iOS, чтобы дать вам надежные инструкции «вот путь к успеху».

UWP / .NET Native и iOS имеют (как вы знаете) общую проблему: отсутствие полной эмиссии во время выполнения. Я понимаю, почему. Это просто: сложно.

Исторически сложилось так, что protobuf-net пытался решить эту проблему с помощью инструмента сборки, который повторял существующий IL-эмит, обычно выполняемый во время выполнения — как инструмент времени сборки. Это было некрасиво и противно, но сработало. Что-то вроде. Чтобы обойти некоторые ограничения платформы, protobuf-net использовал некоторые инструменты IKVM, чтобы помочь с этим, но, поскольку среда .NET framework продолжает расширяться, это в основном нежизнеспособно. Плюс: инструмент IKVM теперь заброшен и не будет поддерживаться.

Параллельно с этим появляется все больше стимулов для изучения некоторых новых концепций:

  • полный async/await для асинхронных источников ввода-вывода: обратите внимание, что это крайне недружественно для генерации IL, но почти смущающе легко реализовать на C#
  • "конвейеры"/"каналы"/"потоки 2" - как бы это не называлось на этой неделе; но: новая концепция ввода-вывода без выделения ресурсов, которая используется в Kestrel (я немного помог разобраться с этим, когда он был на ранних стадиях, поэтому я знаком с тем, что нужно делать) — обратите внимание, что это также связан с async/await
  • и конечно же: как все вышеперечисленное относится к прегенерации

Прямо сейчас я полностью придерживаюсь мнения, что лучший путь вперед — это переключение сценария pre-gen на создание C# с помощью инструментов времени сборки. Я неоднократно ходатайствовал перед MS об улучшении автоматизированного генерирования C# на основе Roslyn, но до сих пор: никакой радости (досадно: материал asp.net даже имел полностью работающее доказательство концепции, но оно отложено). Итак, прямо сейчас я думаю: нам нужно предположить, что этого не произойдет, и, по сути, написать это самостоятельно. Это не обязательно так сложно, как кажется (и мне очень хорошо знакомы различные формы codegen). Преимущество C# emit здесь в том, что мне не нужно бороться с тонкостями каждого фреймворка — мне просто нужно заставить его скомпилироваться (ну и запуститься, очевидно).

Итак: что меня удерживает? Теоретически: ничего. Мне просто нужно, чтобы этот материал был написан и развернут. На самом деле: жизнь, время и т. д. Я виновен в том, что отдаю предпочтение вещам, которые влияют на меня ежедневно, и реальность такова, что я не являюсь пользователем этих платформ каждый день, а значит, я не чувствовать боль, которую ты чувствуешь. Но: я слышу вас громко и ясно, и я пытаюсь ускорить работу над версией 3, которая должна решить эти проблемы. Я действительно хочу иметь хорошую историю для этих вещей, и моя цель состоит в том, чтобы переход на модель генерации C# (по крайней мере, для pre-gen): это помогает мне. И если это поможет мне, я знаю, что это не будет забытая игрушка на чердаке или в подвале, о которой я знаю, но у которой трудно найти мотивацию пойти к проблеме найти.

person Marc Gravell    schedule 07.12.2017
comment
Итак, для краткости, вы говорите мне либо заставить precompile работать, либо подождать, пока вы не закончите v3 Protobuf-net? - person EaranMaleasi; 07.12.2017
comment
@EaranMaleasi Я не знаю; но моя обоснованная догадка заключается в том, что работа по повторному просмотру прекомпиляции в контексте каждой из этих платформ сравнима или даже больше, чем работа для меня, чтобы получить жизнеспособный эмит C# - person Marc Gravell; 07.12.2017
comment
Итак, у вас есть ETA для этой новой версии, которая должна работать на всех платформах? - person EaranMaleasi; 07.12.2017
comment
@EaranMaleasi нет, не знаю; вот где жизнь, время и т. д. приходят на помощь; в конечном счете, моя основная работа заключается не в написании библиотек, так что все это происходит в свободное время (если это не то, что я могу очень искренне сказать, да, это вредит моему работодателю, и исправление этого поможет им - что на самом деле не так) применяются к UWP/iOS/и т. д.). Я не думаю, что это связано с огромным объемом работы, но: время года означает, что оно довольно занято семейными делами и т. д. Итак, нет: у меня нет ожидаемого времени прибытия, которое я бы взял на себя - person Marc Gravell; 07.12.2017
comment
Хорошо. У меня есть крайний срок прямо сейчас, поэтому я временно переключусь на json или что-то в этом роде. Но я буду внимательно следить за protobuf-net и переключаться как можно скорее. Приятно провести время с семьей :D - person EaranMaleasi; 07.12.2017