Общая библиотека Xamarin и PCL

В чем точная разница между общим проектом xamarin и переносимой библиотекой классов?

Когда использовать общую библиотеку, а когда - переносимую библиотеку классов?

Можно ли написать собственные функции в общих проектах, например, показывать оповещения, получать доступ к камере и использовать их как для Android, так и для iOS?

Кто-нибудь, пожалуйста, объясните мне.


person PC Parker    schedule 17.08.2015    source источник


Ответы (1)


  • В общих проектах каждый файл кода компилируется для каждого места назначения (Android, iOS, Windows Phone и т. Д.). Вы можете включить код платформы, используя директивы компилятора #if. Если вы хотите получить доступ к камере, вам необходимо написать код доступа внутри блока #if для всех предназначенных платформ. Это может испортить ваш код, но может быть проще найти различные реализации. Подробнее: http://developer.xamarin.com/guides/cross-platform/application_fundamentals/shared_projects/
  • Переносные библиотеки классов (PCL) скомпилированы на основе общего подмножества .NET, совместимого со всеми необходимыми платформами. Таким образом, вы можете получить доступ к System.Net.Http, но не можете получить доступ к какому-либо конкретному коду платформы. Если вы хотите получить доступ к камере внутри кода PCL, вам необходимо получить к ней доступ через обобщенный интерфейс через внедрение зависимостей. Есть несколько довольно хороших фреймворков, которые помогут вам достичь этой цели. Один из самых известных - MVVMCross (https://github.com/MvvmCross/MvvmCross/wiki). Подробнее о PCL: http://developer.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/sharing_code_options/#Portable_Class_Libraries

Я лично предпочитаю PCL, потому что код намного легче читать без каких-либо директив компилятора. Используя MVVMCross, вы можете использовать множество плагинов через NuGet. Таким образом, вам не нужно писать свои собственные классы для доступа к камере, отображения предупреждений и т. Д.

person Wosi    schedule 17.08.2015
comment
Wosi, Можете ли вы сделать с камерой то же самое, что и с помощью кода для конкретной платформы, используя PCL? - person johnny; 18.10.2016
comment
Конечно! Используя специфичные для платформы реализации для доступа к камере через внедрение зависимостей, скрытых за независимыми от платформы интерфейсами, вы фактически запускаете специфичный для платформы код из PCL. - person Wosi; 18.10.2016
comment
Почему тогда разработчик не захочет использовать PCL? Легче поддерживать SAP? Что-то другое? - person johnny; 18.10.2016
comment
Личное предпочтение. Иногда проще использовать #ifdef, чтобы реализовать (немного) разные вещи для каждой платформы. И, возможно, есть только исторические причины для использования общих проектов: стабильная поддержка PCL для Xamarin появилась только в начале 2013 года. - person Wosi; 18.10.2016