Udostępnij za pośrednictwem


Biblioteki klas przenośnych (PCL)

Napiwek

Biblioteki klas przenośnych (PCLS) są uznawane za przestarzałe w najnowszych wersjach programu Visual Studio. Mimo że nadal można otwierać, edytować i kompilować listy PCLs, w przypadku nowych projektów zaleca się używanie bibliotek .NET Standard w celu uzyskania dostępu do większego obszaru powierzchni interfejsu API.

Kluczowym składnikiem tworzenia aplikacji międzyplatformowych jest możliwość udostępniania kodu w różnych projektach specyficznych dla platformy. Jednak jest to skomplikowane dzięki temu, że różne platformy często używają innego podzestawu biblioteki klas bazowych platformy .NET (BCL), a zatem są rzeczywiście tworzone w innym profilu biblioteki .NET Core. Oznacza to, że każda platforma może używać tylko bibliotek klas przeznaczonych dla tego samego profilu, aby wydawały się wymagać oddzielnych projektów bibliotek klas dla każdej platformy.

Istnieją trzy główne podejścia do udostępniania kodu, które dotyczą tego problemu: projekty platformy .NET Standard, projekty udostępnionych zasobów i projekty przenośnej biblioteki klas (PCL).

  • Projekty .NET Standard są preferowanym podejściem do udostępniania kodu platformy .NET, przeczytaj więcej na temat projektów .NET Standard i platformy Xamarin.
  • Udostępnione projekty zasobów używają jednego zestawu plików i oferują szybki i prosty sposób udostępniania kodu w rozwiązaniu i ogólnie stosuje dyrektywy kompilacji warunkowej w celu określenia ścieżek kodu dla różnych platform, które będą go używać (aby uzyskać więcej informacji, zobacz artykuł Shared Projects (Udostępnione projekty).
  • Projekty PCL są przeznaczone dla określonych profilów, które obsługują znany zestaw klas/funkcji BCL. Jednak po stronie down do PCL jest to, że często wymagają dodatkowego nakładu pracy architektonicznego, aby oddzielić kod specyficzny dla profilu na własne biblioteki.

Na tej stronie wyjaśniono, jak utworzyć projekt PCL przeznaczony dla określonego profilu, do którego można się odwoływać w wielu projektach specyficznych dla platformy.

Co to jest przenośna biblioteka klas?

Podczas tworzenia projektu aplikacji lub projektu biblioteki wynikowa biblioteka DLL jest ograniczona do pracy na określonej platformie, dla której jest tworzona. Uniemożliwia to pisanie zestawu dla aplikacji systemu Windows, a następnie ponowne używanie go na platformie Xamarin.iOS i Xamarin.Android.

Podczas tworzenia przenośnej biblioteki klas można jednak wybrać kombinację platform, na których ma działać kod. Opcje zgodności dokonane podczas tworzenia przenośnej biblioteki klas są tłumaczone na identyfikator "Profil", który opisuje platformy obsługiwane przez bibliotekę.

W poniższej tabeli przedstawiono niektóre funkcje, które różnią się w zależności od platformy .NET. Aby napisać zestaw PCL, który ma gwarancję uruchomienia na określonych urządzeniach/platformach, wystarczy wybrać, która obsługa jest wymagana podczas tworzenia projektu.

Funkcja .NET Framework Aplikacje platformy UWP Silverlight Windows Phone Xamarin
Podstawowe funkcje Y Y Y Y Y
LINQ Y Y Y Y Y
IQueryable Y Y Y 7.5+ Y
Serializacja Y Y Y Y Y
Adnotacje danych 4.0.3 + Y Y Y

Kolumna platformy Xamarin odzwierciedla fakt, że platformy Xamarin.iOS i Xamarin.Android obsługują wszystkie profile dostarczane z programem Visual Studio, a dostępność funkcji w tworzonych bibliotekach będzie ograniczona tylko przez inne platformy wybrane do obsługi.

Obejmuje to profile, które są kombinacjami:

  • .NET 4 lub .NET 4.5
  • Silverlight 5
  • Windows Phone 8
  • Aplikacje platformy UWP

Więcej informacji na temat możliwości różnych profilów można znaleźć w witrynie internetowej firmy Microsoft i zapoznać się z podsumowaniem profilu PCL innego członka społeczności, który zawiera obsługiwane informacje o strukturze i inne uwagi.

Korzyści

  1. Scentralizowane udostępnianie kodu — pisanie i testowanie kodu w jednym projekcie, który może być używany przez inne biblioteki lub aplikacje.
  2. Operacje refaktoryzacji będą mieć wpływ na cały kod załadowany w rozwiązaniu (przenośna biblioteka klas i projekty specyficzne dla platformy).
  3. Projekt PCL można łatwo odwoływać się do innych projektów w rozwiązaniu lub zestaw wyjściowy może być udostępniany innym osobom w celu odwołania się do ich rozwiązań.

Wady

  1. Ponieważ ta sama biblioteka klas przenośnych jest współdzielona między wieloma aplikacjami, nie można odwoływać się do bibliotek specyficznych dla platformy (np. Community.CsharpSqlite.WP7).
  2. Podzestaw biblioteki klas przenośnych może nie zawierać klas, które w przeciwnym razie będą dostępne zarówno w monoTouch, jak i Mono dla systemu Android (np. DllImport lub System.IO.File).

Uwaga

Biblioteki klas przenośnych zostały wycofane w najnowszej wersji programu Visual Studio, a zamiast tego zalecane są biblioteki .NET Standard.

W pewnym stopniu obie wady można obejść przy użyciu wzorca dostawcy lub wstrzykiwania zależności, aby kodować rzeczywistą implementację w projektach platformy względem interfejsu lub klasy bazowej zdefiniowanej w bibliotece klas przenośnych.

Ten diagram przedstawia architekturę aplikacji międzyplatformowej korzystającej z przenośnej biblioteki klas do udostępniania kodu, ale także przy użyciu wstrzykiwania zależności do przekazywania funkcji zależnych od platformy:

Ten diagram przedstawia architekturę aplikacji międzyplatformowej korzystającej z biblioteki klas przenośnych do udostępniania kodu, ale także przy użyciu wstrzykiwania zależności do przekazywania funkcji zależnych od platformy

przewodnik Visual Studio dla komputerów Mac

W tej sekcji opisano sposób tworzenia i używania przenośnej biblioteki klas przy użyciu Visual Studio dla komputerów Mac. Zapoznaj się z sekcją Przykład PCL, aby uzyskać pełną implementację.

Tworzenie języka PCL

Dodawanie przenośnej biblioteki klas do rozwiązania jest bardzo podobne do dodawania zwykłego projektu Biblioteka.

  1. W oknie dialogowym Nowy projekt wybierz opcję Biblioteka przenośna biblioteki > wieloplatformowej>:

    Tworzenie nowego projektu PCL

  2. Po utworzeniu pliku PCL w Visual Studio dla komputerów Mac jest on automatycznie konfigurowany przy użyciu profilu, który działa dla platform Xamarin.iOS i Xamarin.Android. Projekt PCL zostanie wyświetlony, jak pokazano na poniższym zrzucie ekranu:

    Projekt PCL w okienku rozwiązania

PcL jest teraz gotowy do dodania kodu. Można go również odwoływać się do innych projektów (projekty aplikacji, projekty biblioteki, a nawet inne projekty PCL).

Edytowanie ustawień PCL

Aby wyświetlić i zmienić ustawienia PCL dla tego projektu, kliknij prawym przyciskiem myszy projekt i wybierz polecenie Opcje > Kompilacja > Ogólna , aby wyświetlić ekran pokazany tutaj:

Opcje projektu PCL w celu ustawienia profilu

Kliknij przycisk Zmień... , aby zmienić profil docelowy dla tej przenośnej biblioteki klas.

Jeśli profil zostanie zmieniony po dodaniu kodu do biblioteki PCL, biblioteka nie będzie już kompilowana, jeśli kod odwołuje się do funkcji, które nie są częścią nowo wybranego profilu.

Praca z językiem PCL

Gdy kod jest napisany w bibliotece PCL, edytor Visual Studio dla komputerów Mac rozpozna ograniczenia wybranego profilu i odpowiednio dostosuje opcje autouzupełnienia. Na przykład ten zrzut ekranu przedstawia opcje automatycznego uzupełniania dla System.IO przy użyciu profilu domyślnego (Profile136) używanego w Visual Studio dla komputerów Mac — zwróć uwagę na pasek przewijania, który wskazuje około połowy dostępnych klas (w rzeczywistości jest dostępnych tylko 14 klas).

Lista intellisense 14 klas w klasie System.IO PCL

Porównaj to z System.IO autouzupełnianiu w projekcie platformy Xamarin.iOS lub Xamarin.Android — dostępnych jest 40 klas, w tym często używanych klas, takich jak File i Directory które nie znajdują się w żadnym profilu PCL.

Lista funkcji IntelliSense 40 klas w programie .NET Framework System.IO przestrzeni nazw

Odzwierciedla to podstawowe kompromisy związane z używaniem języka PCL — możliwość bezproblemowego udostępniania kodu na wielu platformach oznacza, że niektóre interfejsy API nie są dostępne dla Ciebie, ponieważ nie mają porównywalnych implementacji na wszystkich możliwych platformach.

Korzystanie z biblioteki PCL

Po utworzeniu projektu PCL można dodać do niego odwołanie z dowolnego zgodnego projektu aplikacji lub biblioteki w taki sam sposób, jak zwykle dodawać odwołania. W Visual Studio dla komputerów Mac kliknij prawym przyciskiem myszy węzeł Odwołania i wybierz polecenie Edytuj odwołania... a następnie przejdź do karty Projekty, jak pokazano poniżej:

Dodawanie odwołania do pliku PCL za pomocą opcji Edytuj odwołania

Poniższy zrzut ekranu przedstawia okienko rozwiązania dla przykładowej aplikacji TaskyPortable z wyświetloną biblioteką PCL u dołu i odwołaniem do tej biblioteki PCL w projekcie Xamarin.iOS.

Przykładowe rozwiązanie TaskyPortable przedstawiające projekt PCL

Dane wyjściowe z biblioteki PCL (tj. wynikowej biblioteki DLL zestawu) można również dodać jako odwołanie do większości projektów. Dzięki temu PCL jest idealnym sposobem dostarczania międzyplatformowych składników i bibliotek.

Przykład PCL

Przykładowa aplikacja TaskyPortable pokazuje, jak można używać biblioteki klas przenośnych z platformą Xamarin. Poniżej przedstawiono kilka zrzutów ekranu przedstawiający wynikowe aplikacje działające w systemach iOS i Android:

Poniżej przedstawiono kilka zrzutów ekranu przedstawiający aplikacje wynikowe uruchomione w systemach iOS, Android i Windows Telefon

Udostępnia ona wiele klas danych i logiki, które są wyłącznie przenośnym kodem, a także pokazuje, jak uwzględnić wymagania specyficzne dla platformy przy użyciu wstrzykiwania zależności do implementacji bazy danych SQLite.

Struktura rozwiązania jest pokazana poniżej (odpowiednio w Visual Studio dla komputerów Mac i programie Visual Studio):

Struktura rozwiązania jest pokazana tutaj odpowiednio w Visual Studio dla komputerów Mac i programie Visual Studio

Ponieważ kod SQLite-NET zawiera elementy specyficzne dla platformy (do pracy z implementacjami SQLite w każdym innym systemie operacyjnym) w celach demonstracyjnych został refaktoryzowany w abstrakcyjnej klasie, którą można skompilować w bibliotece klas przenośnych, a rzeczywisty kod zaimplementowany jako podklasy w projektach systemów iOS i Android.

TaskyPortableLibrary

Biblioteka klas przenośnych jest ograniczona w funkcjach platformy .NET, które mogą obsługiwać. Ponieważ jest kompilowany do uruchamiania na wielu platformach, nie może korzystać z funkcji używanych [DllImport] w sqlite-NET. Zamiast tego SQLite-NET jest implementowany jako klasa abstrakcyjna, a następnie przywoływanych przez pozostałą część kodu udostępnionego. Poniżej przedstawiono wyodrębnienie abstrakcyjnego interfejsu API:

public abstract class SQLiteConnection : IDisposable {

    public string DatabasePath { get; private set; }
    public bool TimeExecution { get; set; }
    public bool Trace { get; set; }
    public SQLiteConnection(string databasePath) {
         DatabasePath = databasePath;
    }
    public abstract int CreateTable<T>();
    public abstract SQLiteCommand CreateCommand(string cmdText, params object[] ps);
    public abstract int Execute(string query, params object[] args);
    public abstract List<T> Query<T>(string query, params object[] args) where T : new();
    public abstract TableQuery<T> Table<T>() where T : new();
    public abstract T Get<T>(object pk) where T : new();
    public bool IsInTransaction { get; protected set; }
    public abstract void BeginTransaction();
    public abstract void Rollback();
    public abstract void Commit();
    public abstract void RunInTransaction(Action action);
    public abstract int Insert(object obj);
    public abstract int Update(object obj);
    public abstract int Delete<T>(T obj);

    public void Dispose()
    {
        Close();
    }
    public abstract void Close();

}

Pozostała część kodu udostępnionego używa klasy abstrakcyjnej do "przechowywania" i "pobierania" obiektów z bazy danych. W każdej aplikacji korzystającej z tej klasy abstrakcyjnej musimy przekazać kompletną implementację, która zapewnia rzeczywistą funkcjonalność bazy danych.

TaskyAndroid i TaskyiOS

Projekty aplikacji dla systemów iOS i Android zawierają interfejs użytkownika i inny kod specyficzny dla platformy używany do podłączania udostępnionego kodu w języku PCL.

Te projekty zawierają również implementację abstrakcyjnego interfejsu API bazy danych, który działa na tej platformie. W systemach iOS i Android aparat bazy danych Sqlite jest wbudowany w system operacyjny, więc implementacja może być używana [DllImport] w sposób pokazany w celu zapewnienia konkretnej implementacji łączności z bazą danych. Poniżej przedstawiono fragment kodu implementacji specyficznego dla platformy:

[DllImport("sqlite3", EntryPoint = "sqlite3_open")]
public static extern Result Open(string filename, out IntPtr db);

[DllImport("sqlite3", EntryPoint = "sqlite3_close")]
public static extern Result Close(IntPtr db);

Pełną implementację można zobaczyć w przykładowym kodzie.

Podsumowanie

W tym artykule krótko omówiono zalety i pułapki bibliotek klas przenośnych, przedstawiono sposób tworzenia i używania list PCL z poziomu Visual Studio dla komputerów Mac i programu Visual Studio, a na koniec wprowadzono pełną przykładową aplikację — TaskyPortable — która pokazuje pcL w działaniu.