PCL — Portable Class Libraries в Xamarin

Эта статья знакомит с проектами Portable Class Library (PCL), содержит пошаговое описание создания и использования PCL-проектов в Xamarin Studio и Visual Studio.

PCL

Обзор

Ключевым компонентом создания кроссплатформенных приложений является возможность совместного использования кода между различными платформами проекта. Однако это затрудняется тем фактом, что различные платформы часто используют различные подгруппы .NET библиотеки базовых классов (BCL) и поэтому построены на другом профиле ядра библиотеки .NET. То есть, каждая платформа может использовать только те, библиотеки классов, которые ориентированы на свой профиль, поэтому они требуют проекты библиотек отдельных классов для каждой платформы.

Существует два основных подхода к совместному использованию кода, которые устраняют эту проблему:  Общие проекты (Shared Projects) и проекты Портативной библиотеки классов (Portable Class Library — PCL).

  • Общие проекты используют один набор файлов и предлагает быстрый и простой способ для совместного использования кода внутри решения и в целом использует директивы условной компиляции для указания веток кода для различных платформ, которые будут его использовать (для получения дополнительной информации см. Shared Projects и Руководство по настройке кроссплатформенного решения Xamarin)
  • PCL проекты ориентированы на конкретные профили, которые поддерживают известный набор BCL классов / функций. Тем не менее, обратной стороной PCL является то, что они часто требуют дополнительных усилий, чтобы архитектурно разделить профили конкретного кода в своих библиотеках. Для более детального обсуждения этих двух подходов см  Руководство по использованию Общего кода .

Эта страница объясняет, как создать PCL-проект, который предназначен для определенного профиля, на который затем можно ссылаться из нескольких платформоспецифичных проектов.

Требования

Поддержка PCL была добавлена в Xamarin.Android 4.10.1, Xamarin.iOS 7.0.4 и Xamarin студии 4.2. PCL проекты автоматически включаются в Xamarin студии на OS X, и встроены в Visual Studio 2013 и более поздних версий.

В Visual Studio 2012 могут отсутствовать включённые последние профили PCL (например, для использования с Xamarin.Forms). Эти PCL сборки 4.6 можно загрузить с Microsoft.

Если вы используете Xamarin Studio для Windows (без установки Visual Studio), вам необходимо будет загрузить Portable Library Tools, чтобы использовать PCL. Следуйте инструкциям по установке PCL на Windows.

Поскольку разработка для Windows Phone 8 требует Windows 8 или более поздней версии, вы не сможете создавать библиотеки для некоторых профилей, которые требуют эти SDK на Windows 7, независимо от того, какая версия Visual Studio или Xamarin Studio, у вас установлена.

Что такое портативная библиотека классов PCL?

При создании «регулярного» проекта приложения или проекта библиотеки DLL ограничено тем, что оно будет работать только на конкретной платформе, для которой оно создано. Это не позволит вам писать сборку для Windows Phone приложения, и затем повторно использовать его на Xamarin.iOS и Xamarin.Android.

Тем не менее, при создании PCL-проекта, вы можете выбрать комбинацию платформ, на которых приложение будет работать. Выбор совместимости вы делаете при создании PCL-проекта в идентификаторе «Профиль», который описывает, какие платформы библиотека будет поддерживать.

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

Функции .NET Framework Windows Store Apps Silverlight Windows Phone Xamarin
Core ДА ДА ДА ДА ДА
LINQ ДА ДА ДА ДА ДА
IQueryable ДА ДА ДА 7.5 + ДА
Serialization ДА ДА ДА ДА ДА
Data Annotations 4.0.3 + ДА ДА НЕТ ДА

Колонка Xamarin отражает тот факт, что Xamarin.iOS и Xamarin.Android поддерживает все профили, поставляемые с Visual Studio 2013, а также наличие возможностей в любых библиотеках, которые вы создаете, будет ограничено только тему платформами, которые вы выбираете для поддержки (например, Windows Phone или Windows Store).

Это включает в себя профили, которые являются комбинациями:

  • .NET 4 или .NET 4.5
  • Silverlight 5
  • Windows Phone 8
  • Windows Store Apps

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

Создание PCL-проекта для совместного использования кода имеет ряд плюсов и минусов:

Достоинства

  • Централизованное совместное использование кода — писать и тестировать код в одном проекте, который может использоваться другими библиотеками или приложениями.
  • Операции рефакторинга будут влиять на весь код, используемый в решении (PCL-проектов и проектов конкретных платформ).
  • Проект PCL можно легко ссылаться другие проекты в решении и конечная сборка может совместно использоваться для других проектах, чтобы ссылаться в своих решениях.

Недостатки

  • Проект PCL не может ссылаться на платформоспецифичные библиотеки (например. Community.CsharpSqlite.WP7).
  • Подмножество PCL не может включать в себя классы, которые переопределены в обоих библиотеках MonoTouch и Mono для Android (например, DllImport или System.IO.File).

В какой-то степени оба недостатка можно обойти, используя Шаблоны поставщика (Provider pattern) или Внедрение зависимости (Dependency Injection) для фактической реализации кода в проектах  каждой платформы для интерфейса или базового класса, который определен в PCL.

На этой диаграмме показана архитектура кроссплатформенного приложения PCL для совместного использования кода, используя Внедрение зависимости для передачи платформозависимых функций:

Пошаговое руководство дляVisual Studio

Этот раздел описывает как создать и использовать PCL с помощью Visual Studio.

Создание PCL-проекта

Добавление PCL-проекта в решения в Visual Studio немного отличается для добавления регулярного проекта.

  1. В окне Add New Project выберите вариант Portable Class Library

2. Visual Studio покажет следующее диалоговое окно, для настройки профиля приложения. Отметьте галочкой платформы, которые необходимо поддерживать и нажмите OK.

3. Проект PCL будет выглядеть, как показано в Обозревателе решений. В узле Ссылки будет указано, что библиотека использует подмножество .NET Framework (определяется профилем PCL).

PCL-проект  теперь готов к написанию кода. Он также может ссылаться другие проекты (проекты приложений, библиотечных проектов и даже других PCL проектов).

Редактирование настроек PCL

PCL настройки можно просмотреть и изменить, щелкнув правой кнопкой мыши на проекте и выбрав Properties > Library , как показано на скриншоте:

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

Работа с PCL

Когда код написан в библиотеке PCL, Visual Studio распознает ограничения выбранного профиля и соответственно настраивает параметры Intellisense. Например, этот скриншот показывает автозаполнение опции System.IO, используя профиль по умолчанию в Xamarin Studio (Profile136) — обратите внимание на полосу прокрутки, отображаются около половины доступных классов (на самом деле доступны только 14 классов).

Сравните это с автозаполнением System.IO в обычном проекте – там доступно 40 классов, в том числе часто используемые, такие как файлы и каталоги, которые отсутствуют в любом профиле PCL.

Это отражает основной компромисс использования PCL — возможность лёгкого совместного использования кода на многих платформах означает, что некоторые API-интерфейсы будут недоступны, потому что они не имеют сопоставимые реализации во всех возможных платформах.

Использование PCL

После того, как PCL проект был создан, вы можете добавить ссылку на него с любого совместимого приложения или библиотеки так же, как вы обычно добавлять ссылки. В Visual Studio, щелкните правой кнопкой мыши на узле References и выберите Add Reference… затем переключиться на решение: вкладку Projects, как показано ниже:

На следующем рисунке показана панель Solution для примера приложения TaskyPortable, показывая PCL-библиотеку в нижней части и ссылку на эту PCL-библиотеку в проекте Xamarin.iOS.

Выходной PCL (т. е. результирующая сборка DLL) также может быть добавлен в качестве ресурса для большинства проектов. Это делает PCL идеальным способом для создания кроссплатформенных компонентов и библиотек.

Пример PCL приложения

TaskyPortable  — пример приложения, демонстрирующего как PCL может быть использован в Xamarin. Вот некоторые скриншоты полученных приложений, работающих на iOS, Android и Windows Phone:

Он разделяет ряд данных и логических классов, которые являются чистым переносимым код, и он также демонстрирует, как включить требования конкретной платформы с помощью Внедрение зависимости (Dependency Injection) для реализации SQLite базы данных.

Структура решения показана ниже (в Xamarin Studio и Visual Studio соответственно):

Поскольку код SQLite-NET имеет специфичные для платформы части (для работы с реализацией SQLite на каждой отдельно операционной системе), для демонстрационных целей он был переработан в абстрактный класс, который может быть скомпилирован в PCL и фактический код реализован как подклассы в iOS и Android проектах.

TaskyPortableLibrary

PCL ограничено поддерживает .NET функции, поскольку она составлена для работы на нескольких платформах, она не может использовать функциональность [DllImport], которая используется в SQLite-NET. Вместо этого SQLite-NET реализуется как абстрактный класс, а затем ссылается через остальную часть совместно используемого кода. Экстракт абстрактного API приведен ниже:

Остальная часть общего кода использует абстрактный класс для «хранилища» и «извлечения» объектов из базы данных. В любом приложении, которое использует этот абстрактный класс, необходимо прописать полную реализацию, которая обеспечивает реальную функциональность базы данных.

TaskyAndroid и TaskyiOS

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

Эти проекты также содержат реализацию абстрактного API базы данных, который работает на этой платформе. В iOS и Android ядро базы данных Sqlite является встроенным в операционную систему, поэтому реализация может использовать [DllImport], как показано, чтобы обеспечить конкретную реализацию подключения к базам данных. Выдержка реализации кода для конкретной платформы приведен здесь:

Полную реализацию можно увидеть в примере кода.

TaskyWinPhone

Приложение Windows Phone имеет свой пользовательский интерфейс, построенный с помощью XAML и содержит другой платформоспецифичный код для соединения совместно используемых объектов с пользовательским интерфейсом.

В отличие от реализации, используемой для iOS и Android, в Windows Phone приложении необходимо создать и использовать экземпляр Community.Sqlite.dll  как часть своего абстрактного API базы данных. Вместо того чтобы использовать DllImport, методы, такие как Open, реализуются иначе, с помощью сборки Community.Sqlite, на которую ссылаются в проекте TaskWinPhone. Отрывок приведен здесь для сравнения с iOS и Android версией, приведённой выше.

Резюме

В этой статье кратко рассмотрены преимущества и недостатки PCL, было показано, как создавать и использовать PCL в Xamarin Studio и Visual Studio; и, наконец, представлен полный пример приложения — TaskyPortable — который показывает PCL в действии.

 


Оригинал статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *