О каких ограничениях я должен знать, чтобы максимизировать переносимость моно-кода? - PullRequest
7 голосов
/ 04 октября 2011

Мне интересно написать кроссплатформенный код с использованием Mono с целью нацеливания на среды выполнения мобильных iOS и Android.

Я просмотрел сайты Mono и MonoTouch, но ничего не вижуэто конкретно советует методы, которые не следует использовать, или моно-хуки, которых следует избегать.Тем не менее, это кажется слишком хорошим, чтобы быть правдой.

Какие ограничения я должен знать, чтобы войти в этот проект, чтобы обеспечить максимальную переносимость кода?

Ответы [ 4 ]

3 голосов
/ 04 октября 2011

API мудро, вы получаете очень похожие библиотеки базовых классов (BCL) при использовании MonoTouch или Mono для Android (M4A), поскольку оба используют один и тот же профиль mobile (который изначально был основан нав профиле Silverlight и расширен для использования большего количества FX 4.0 API).

Это много общего кода.Различия в BCL минимальны, но некоторые существуют, в основном потому, что для работы на устройствах iOS требуются некоторые компромиссы, что создает некоторые ограничения .

За пределами BCL MonoTouch и M4A предоставляют привязки для своей платформы.Например, MonoTouch предоставляет monotouch.dll, который связывает большую часть API iOS (на основе C или ObjectiveC).Эта часть не будет работать в Mono для Android (и то же самое верно для привязок Android, которые предоставляет M4A).

Вот где вам нужно придумать дизайн, чтобы минимизировать различия.Во многих случаях самый другой аспект - это пользовательские интерфейсы , и существует несколько подходов, многие из которых основаны на MVC (например, MonoCross ), чтобы сделать эторазработчикам стало проще и понятнее для каждой платформы.

2 голосов
/ 04 октября 2011

В дополнение к пользовательскому интерфейсу приобретите привычку к тому, чтобы у внешних зависимостей были варианты, которые функционируют на всех ваших желаемых платформах, или будьте готовы вычленить их.

Для меня подводными камнями были:

  • Сжатие - Недоступно в silverlight, если нужно пользователю sharpziplib (я знаю, вы не нацеливаетесь на silverlight, нона всякий случай.)
  • Сериализация - Protobuf-net - ваш друг.
  • Хранилище - Это самая хитрая.Используете ли вы обычный ввод-вывод, изолированное хранилище или одно на одной платформе, а другое - на другой?Кроме того, mono.sqlite работает практически везде, кроме серебряного света, поэтому примите это и при необходимости создайте план на случай непредвиденных обстоятельств для серебряного света.
  • Придумано в MS - Забудьте об этом.WCF, структура сущностей, SQL-CE, LINQ to SQL и так далее.Mono отлично справляется с ядром .NET, но очень неохотно относится к периферийным технологиям, которые, в любом случае, не имеют большого значения для IMO.

При этом я обнаружил, что переносимость удивительно безболезненна.На самом деле это было так хорошо, что я смог перенести код, предназначенный для настольных компьютеров, на мобильный телефон всего за день или два, хотя после этого мне пришлось потратить довольно много времени на оптимизацию.Тот факт, что код переносим, ​​не означает, что он будет работать одинаково на всех платформах!Я думаю, что лучше всего делать кодирование с использованием «зеленого поля» на самой чувствительной к производительности платформе, которая, по мнению IMO, является монодроидом, поскольку имеет сложности с JIT на мобильном устройстве, сборкой мусора между виртуальными машинами и т. Д.

1 голос
/ 04 октября 2011

Вы пробовали Mono Migration Analyzer (MoMa) ?Это не окончательное решение, но оно может обеспечить вам достойную переносимость во время выполнения Mono.

0 голосов
/ 04 октября 2011

Я сделал кроссплатформенное кодирование .Net с использованием MonoTouch (iOS), Mono для Android и Silverlight для Windows Phone 7. Я обнаружил, что хорошим подходом было бы основывать мой код на времени выполнения Silverlight, так как большая часть этоготакже поддерживается на Mono.

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

Между платформами есть одно существенное отличие: на iOS ваш код предварительно скомпилирован, поэтому поддержка ограниченаотражение.Большинство вещей работает отлично, но вы должны быть осторожны с использованием кода, тяжело отражающегося на iOS.

...