Исходный код в проектах Xamarin можно поделить на две части: Общий код (для всех платформ, например, описание доменной модели и реализация бизнес логики.) и Код специфичный для конкретной ОС (например, работа с файловой системой, графическим интерфейсом и т.д. Для каждой конкретной ОС создается отдельный проект приложения, исходный код которого будет компилироваться под указанную ОС).
Для вынесения общего кода в отдельный проект, который затем можно было бы использовать в приложениях, которые компилируются под iOS, Android и Windows Phone, Xamarin предлагает две опции: Shared Projects (это тип библиотеки, который при помощи директив компилятора #if позволяет в исходном коде указывать, для какой платформы должен компилироваться код) и Portable Class Libraries (библиотека, которая дает возможность выполнять специфичный для платформы код при помощи Inversion of Control (IoC). Классам, определенным в этой библиотеке передаются интерфейсы, реализация которых зависит от платформы).
Shared Projects Преимущества:
● Позволяет использовать код, написанный в общем проекте, в любых других проектах.
● Код, специфичный для ОС, просто помечается директивами #if.
● Приложения для конкретной ОС ссылаются на общий проект.
Недостатки:
● Общий проект не компилируется в отдельную сборку, он компилируется как часть приложения, которое на него ссылается. Если необходимо, чтобы общий код компилировался в отдельную сборку, нужно использовать подход Portable Class Libraries.
● Сложно делать рефакторинг участков кода, которые содержат в себе директивы компилятора для разных ОС. Необходима компиляция под разные платформы для проверки кода.
Portable Class Libraries Преимущества:
● Позволяет использовать код, написанный в общем проекте, в любых других проектах.
● Рефакторинг делать проще, поскольку изменения кода в Protable library можно проверить одной компиляцией.
● Этот подход можно использовать для сборки исполняемого файла с целью распространения другим разработчикам.
Недостатки:
● Невозможно использовать директивы компилятора для включения кода, специфичного для конкретной ОС.
● Только ограниченная часть.Net Framework доступна для включения в проект.