Настройка .NET Portable Framework на Xamarin Studio

При создании кроссплатформенных мобильных приложений с использование Xamain + (Monotouch или Monodroid) практически всегда следует создать отдельный слой библиотек, которые выполняются для всех платформ. Например это библиотека Core в проекте, занимается работой с сетью, хранит классы моделей и различные утилиты и настройки, необходимые во всех проектах.

При создании такой библиотеки в Xamarin Studio автоматически импортируются .NET Portable Subset пакет.

.net portable subset

Если раскрыть этот пакет - там будут все библиотеки, подключенные к текущему профилю и версии .NET.

Профили

До разработки мобильных приложений, разработчики врятли сталкивались с таким понятием, как профиль, тем более если их ±50 шт. При создании PCL (Portable Class Library) необходимо выбрать профиль разработки. Физически профиль (Profile) представляет из себя папку с названием, библиотеками и списком поддерживаемых платформ. 

В Windows профили находятся по адресу

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\

В 4-й версии фреймворка находится 27 профилей, в 4.5 всего 3.

В Mac эти файлы лежат по адресу

/Library/Frameworks/Mono.framework/Versions/3.2.4/lib/mono/xbuild-frameworks/.NETPortable

Профиль это комплект скомпилированных библиотек для конкретной версии .net framework и список поддерживаемых платформ (указаны в папке SupportedFrameworks)

Настройка .Net Portable в Xamarin Studio

При установке Mono на Mac, в комплект установки не входят PCL. Соответственно их нужно скопировать с Windows машины и разместить по адресу указанному выше.

mac dot net portable

Сейчас эти библиотеки по лицензии доступны для всех платформ, возможно скоро появится установочный файл и для Mac.

После копирования, могут появляться ошибки компиляции. Например, компилятор может не найти некоторые типы (хотя физически они будут в .Net Portable).

Compile error xamarin

Эта ошибка появляется, т.к. не правильно указаны настройки компилятора. Делается это в файле Microsoft.Portable.CSharp.targets, который расположен по адресу /Library/Frameworks/Mono.framework/Versions/3.2.4/lib/mono/xbuild/Microsoft/Portable/v4.0 (для 4.5 версии аналогично).

Вручную редактировать этот файл смысла нет. Я нашел в интернете файл, который вставил в обе версии (4.0 + 4.5) и эти ошибки перестали появляться. Мою версию файла можно скачать. Содержимое файла представлено ниже:

<!-- Note: This is a dummy CSharp.targets file that tries to map Portable Library Project targets to something available in Mono on Mac -->

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
    <PropertyGroup>
        <TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
        <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
        <TargetFrameworkProfile></TargetFrameworkProfile>
    </PropertyGroup>
    
    <PropertyGroup Condition = "Exists ('/Developer/MonoTouch/License.rtf')">
        <TargetFrameworkIdentifier>MonoTouch</TargetFrameworkIdentifier>
        <TargetFrameworkVersion>v1.0</TargetFrameworkVersion>
        <TargetFrameworkProfile></TargetFrameworkProfile>
        <CscToolPath>/Developer/MonoTouch/usr/bin</CscToolPath>
        <CscToolExe>smcs</CscToolExe>
    </PropertyGroup>
    
    <PropertyGroup Condition = "Exists ('/Developer/MonoAndroid/License.rtf') And !Exists ('/Developer/MonoTouch/License.rtf')">
        <TargetFrameworkIdentifier>MonoAndroid</TargetFrameworkIdentifier>
        <CscToolPath>/Developer/MonoAndroid/usr/bin</CscToolPath>
        <CscToolExe>smcs</CscToolExe>
    </PropertyGroup>
    
    <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" Condition = "Exists ('/Developer/MonoAndroid/License.rtf') And !Exists ('/Developer/MonoTouch/License.rtf')"/>
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.Targets" Condition = "Exists ('/Developer/MonoTouch/License.rtf') Or !Exists ('/Developer/MonoAndroid/License.rtf')"/>
    
    <PropertyGroup>
        <BuildDependsOn>
            PortableCompatWarning;
            $(BuildDependsOn);
        </BuildDependsOn>
    </PropertyGroup>
    
    <Target Name="PortableCompatWarning">
        <Warning Text="This Portable Library Project has been built against the $(TargetFrameworkIdentifier) framework."/>
    </Target>
    
</Project>

Ура! После этого ошибка компиляции, связанная с настройками компилятора и этим файлом появляться перестала!

Настройка Profile в Xamarin Studio

Для того, чтобы библиотека могла быть подключена в другие проекты (Monotouch + Monodroid), нужно, чтобы в поддерживаемых платформах стояли галочки iOS + Android

profile xamarin ios

Так как мы скопировали библиотеки PCL с Windows, то профиля для разработки iOS и Android приложений у нас нет. Для того, чтобы появились строки Xamarin.Android и Xamarin.iOS необходимо поместить файлы xamarin.ios.xml и xamarin.android.xml в директорию /Library/Frameworks/Mono.framework/Versions/3.2.4/lib/mono/xbuild-frameworks/.NETPortable/v4.5/Profile/Profile78/SupportedFrameworks. Вместо версии .net 4.5 и профиля 78 можно выбрать любые возможные. Для 4.0 версии .net рекомендуется 158 профиль, а для 4.5 - 78.

Текст файла xamarin.ios.xml представлен ниже, для андроида он похож.

<?xml version="1.0" encoding="utf-8"?><Framework Name="Xamarin.iOS" Identifier="MonoTouch" DisplayName="Xamarin.iOS" Profile="*" MinimumVersion="1.0" MinimumVersionDisplayName="" MonoSpecificVersion="NoDLR" MonoSpecificVersionDisplayName="(no Reflection or DLR)" />

Однако после этого, ничего не изменилось, строчки с платформами не появились. Связано это с тем, что Mono хранит 2 копии этих библиотек. Вторая находится по адресу /Library/Frameworks/Mono.framework/External/xbuild-frameworks/.NETPortable. В этой папке необходимо проделать все те же измения, что и в предыдущий раз. После этого появится возможноть выбрать платформу iOS + Android

Комментарии

comments powered by Disqus