Taşınabilir Sınıf Kitaplıkları (PCL)

İpucu

Taşınabilir Sınıf Kitaplıkları (PCL) Visual Studio'nun en son sürümlerinde kullanım dışı olarak kabul edilir. PCL'leri açmaya, düzenlemeye ve derlemeye devam edebilirsiniz ancak yeni projeler için daha büyük bir API yüzey alanına erişmek için .NET Standart kitaplıkları kullanmanız önerilir.

Platformlar arası uygulamalar oluşturmanın önemli bileşenlerinden biri, platforma özgü çeşitli projelerde kod paylaşabilmektir. Ancak, bu durum farklı platformların .NET Temel Sınıf Kitaplığı'nın (BCL) farklı bir alt kümesini kullanması ve bu nedenle aslında farklı bir .NET Core Kitaplık Profiline derlenmiş olması nedeniyle karmaşıktır. Bu, her platformun yalnızca aynı profile hedeflenen sınıf kitaplıklarını kullanabileceği ve bu nedenle her platform için ayrı sınıf kitaplığı projeleri gerektirdiği anlamına gelir.

Bu sorunu ele alan üç önemli kod paylaşımı yaklaşımı vardır: .NET Standart projeleri, Paylaşılan Varlık Projeleri ve Taşınabilir Sınıf Kitaplığı (PCL) projeleri.

  • .NET Standard projeleri .NET kodunu paylaşmak için tercih edilen yaklaşımdır. .NET Standard projeleri ve Xamarin hakkında daha fazla bilgi edinin.
  • Paylaşılan Varlık Projeleri tek bir dosya kümesi kullanır ve bir çözüm içinde kod paylaşmak için hızlı ve basit bir yol sunar ve genellikle bunu kullanacak çeşitli platformlar için kod yollarını belirtmek üzere koşullu derleme yönergeleri kullanır (daha fazla bilgi için Paylaşılan Projeler makalesine bakın).
  • PCL projeleri, bilinen BCL sınıflarını/özelliklerini destekleyen belirli profilleri hedefler. Ancak, PCL'nin alt tarafı genellikle profile özgü kodu kendi kitaplıklarına ayırmak için fazladan mimari çabaya ihtiyaç duymalarıdır.

Bu sayfada, platforma özgü birden çok proje tarafından başvurulabilen belirli bir profili hedefleyen bir PCL projesinin nasıl oluşturulacağı açıklanır.

Taşınabilir Sınıf Kitaplığı nedir?

Bir Uygulama Projesi veya Kitaplık Projesi oluşturduğunuzda, sonuçta elde edilen DLL, oluşturulduğu platform üzerinde çalışmayla sınırlıdır. Bu, bir Windows uygulaması için derleme yazmanızı ve ardından Xamarin.iOS ve Xamarin.Android'de yeniden kullanmanızı engeller.

Bununla birlikte, Taşınabilir Sınıf Kitaplığı oluşturduğunuzda kodunuzun üzerinde çalışmasını istediğiniz platformların bir bileşimini seçebilirsiniz. Taşınabilir Sınıf Kitaplığı oluştururken yaptığınız uyumluluk seçimleri, kitaplığın hangi platformları desteklediğini açıklayan bir "Profil" tanımlayıcısına çevrilir.

Aşağıdaki tabloda .NET platformuna göre değişen bazı özellikler gösterilmektedir. Belirli cihazlarda/platformlarda çalışması garanti edilen bir PCL derlemesi yazmak için, projeyi oluştururken hangi desteğin gerekli olduğunu seçmeniz yeterlidir.

Özellik .NET Framework UWP uygulamaları Silverlight Windows Phone Xamarin
Temel Y Y Y Y Y
LINQ Y Y Y Y Y
IQueryable Y Y Y 7.5+ Y
Serileştirme Y Y Y Y Y
Veri Açıklamaları 4.0.3 + Y Y Y

Xamarin sütunu, Xamarin.iOS ve Xamarin.Android'in Visual Studio ile birlikte gelen tüm profilleri desteklediğini yansıtır ve oluşturduğunuz tüm kitaplıklardaki özelliklerin kullanılabilirliği yalnızca desteklemeyi seçtiğiniz diğer platformlarla sınırlandırılır.

Bu, aşağıdakilerin bileşimleri olan profilleri içerir:

  • .NET 4 veya .NET 4.5
  • Silverlight 5
  • Windows Phone 8
  • UWP uygulamaları

Microsoft'un web sitesinde farklı profillerin özellikleri hakkında daha fazla bilgi edinebilir ve desteklenen çerçeve bilgilerini ve diğer notları içeren başka bir topluluk üyesinin PCL profil özetini görebilirsiniz.

Avantajlar

  1. Merkezi kod paylaşımı : Diğer kitaplıklar veya uygulamalar tarafından kullanılabilecek tek bir projede kod yazma ve test etme.
  2. Yeniden düzenleme işlemleri, çözümde yüklenen tüm kodları (Taşınabilir Sınıf Kitaplığı ve platforma özgü projeler) etkiler.
  3. PCL projesine bir çözümdeki diğer projeler tarafından kolayca başvurulabilir veya çıkış derlemesi başkalarının çözümlerinde başvurması için paylaşılabilir.

Dezavantajlar

  1. Aynı Taşınabilir Sınıf Kitaplığı birden çok uygulama arasında paylaşıldığından platforma özgü kitaplıklara başvurulamaz (örneğin. Community.CsharpSqlite.WP7).
  2. Taşınabilir Sınıf Kitaplığı alt kümesi, Android için MonoTouch ve Mono'da (DllImport veya System.IO.File gibi) kullanılabilir olabilecek sınıfları içermeyebilir.

Not

Taşınabilir Sınıf Kitaplıkları Visual Studio'nun en son sürümünde kullanım dışı bırakılmıştır ve bunun yerine .NET Standart Kitaplıkları önerilir.

Bir ölçüde her iki dezavantaj da Sağlayıcı deseni veya Bağımlılık Ekleme kullanılarak aşılabilir ve platform projelerindeki gerçek uygulamayı Taşınabilir Sınıf Kitaplığı'nda tanımlanan bir arabirime veya temel sınıfa göre kodlayabilir.

Bu diyagramda, kodu paylaşmak için Taşınabilir Sınıf Kitaplığı kullanan ve platforma bağımlı özellikleri geçirmek için Bağımlılık Ekleme özelliğini kullanan platformlar arası bir uygulamanın mimarisi gösterilmektedir:

This diagram shows the architecture of a cross-platform application using a Portable Class Library to share code, but also using Dependency Injection to pass in platform-dependent features

Mac için Visual Studio izlenecek yol

Bu bölümde, Mac için Visual Studio kullanarak Taşınabilir Sınıf Kitaplığı oluşturma ve kullanma adımları anlatılır. Eksiksiz bir uygulama için PCL Örneği bölümüne bakın.

PCL oluşturma

Çözümünüze Taşınabilir Sınıf Kitaplığı eklemek, normal bir Kitaplık projesi eklemeye çok benzer.

  1. Yeni Proje iletişim kutusunda Çok Platformlu > Kitaplık Taşınabilir Kitaplığı> seçeneğini belirleyin:

    Create a new PCL project

  2. Mac için Visual Studio bir PCL oluşturulduğunda, Xamarin.iOS ve Xamarin.Android için çalışan bir Profil ile otomatik olarak yapılandırılır. PCL projesi bu ekran görüntüsünde gösterildiği gibi görünür:

    PCL project in the solution pad

PCL artık kodun eklenmesi için hazırdır. Diğer projeler (Uygulama projeleri, Kitaplık projeleri ve hatta diğer PCL projeleri) tarafından da başvurulabilir.

PCL ayarlarını düzenleme

Bu projenin PCL ayarlarını görüntülemek ve değiştirmek için projeye sağ tıklayın ve Burada gösterilen ekranı görmek için Seçenekler > Derleme > Genel'i seçin:

PCL Project Options to set the profile

Bu taşınabilir sınıf kitaplığının hedef profilini değiştirmek için Değiştir... öğesine tıklayın.

Kod PCL'ye eklendikten sonra profil değiştirilirse, kod yeni seçilen profilin parçası olmayan özelliklere başvuruda bulunuyorsa kitaplığın artık derlenmemesi mümkündür.

PCL ile çalışma

Kod bir PCL kitaplığında yazıldığında, Mac için Visual Studio düzenleyicisi seçilen profilin sınırlamalarını tanır ve otomatik tamamlama seçeneklerini buna göre ayarlar. Örneğin, bu ekran görüntüsünde, Mac için Visual Studio kullanılan varsayılan profili (Profil136) kullanarak System.IO için otomatik tamamlama seçenekleri gösterilir. Kullanılabilir sınıfların yaklaşık yarısının görüntülendiğini gösteren kaydırma çubuğuna dikkat edin (aslında yalnızca 14 sınıf vardır).

Intellisense list of 14 classes in the System.IO class of a PCL

Bunu bir Xamarin.iOS veya Xamarin.Android projesinde otomatik tamamlama System.IO ile karşılaştırın; ve gibi File yaygın olarak kullanılan ve Directory herhangi bir PCL profilinde bulunmayan 40 sınıf vardır.

Intellisense list of 40 classes in .NET Framework System.IO namespace

Bu, PCL kullanmanın temeldeki dengesini yansıtır. Birçok platformda kodu sorunsuz bir şekilde paylaşabilmek, bazı API'lerin tüm olası platformlarda karşılaştırılabilir uygulamaları olmadığı için sizin kullanımınıza sunulmadığı anlamına gelir.

PCL kullanma

BIR PCL projesi oluşturulduktan sonra, normalde başvuru eklediğiniz gibi uyumlu herhangi bir Uygulama veya Kitaplık projesinden buna başvuru ekleyebilirsiniz. Mac için Visual Studio'da, Başvurular düğümüne sağ tıklayın ve Başvuruları Düzenle... öğesini seçin ve gösterildiği gibi Projeler sekmesine geçin:

Add a reference to a PCL via Edit References option

Aşağıdaki ekran görüntüsünde, en alttaki PCL kitaplığını ve Xamarin.iOS projesindeki bu PCL kitaplığına başvuruyu gösteren TaskyPortable örnek uygulamasının Çözüm bölmesi gösterilmektedir.

TaskyPortable sample solution showing PCL project

Bir PCL'den (sonuçta elde edilen derleme DLL'sinin) çıkışı da çoğu proje için başvuru olarak eklenebilir. Bu, PCL'yi platformlar arası bileşenleri ve kitaplıkları göndermek için ideal bir yol haline getirir.

PCL örneği

TaskyPortable örnek uygulaması, Taşınabilir Sınıf Kitaplığı'nın Xamarin ile nasıl kullanılabileceğini gösterir. iOS ve Android'de çalışan sonuçta elde edilen uygulamaların bazı ekran görüntüleri şunlardır:

Here are some screenshots of the resulting apps running on iOS, Android and Windows Phone

Tamamen taşınabilir kod olan bir dizi veri ve mantıksal sınıfı paylaşır ve ayrıca SQLite veritabanı uygulaması için Bağımlılık Ekleme'yi kullanarak platforma özgü gereksinimlerin nasıl birleştirildiğini gösterir.

Çözüm yapısı aşağıda gösterilmiştir (sırasıyla Mac için Visual Studio ve Visual Studio'da):

The solution structure is shown here in Visual Studio for Mac and Visual Studio respectively

SQLite-NET kodu, tanıtım amacıyla platforma özgü parçalara (her farklı işletim sistemindeki SQLite uygulamalarıyla çalışmak için) sahip olduğundan, Taşınabilir Sınıf Kitaplığı'nda derlenebilen soyut bir sınıfa ve iOS ve Android projelerinde alt sınıf olarak uygulanan gerçek koda yeniden düzenlenmiştir.

TaskyPortableLibrary

Taşınabilir Sınıf Kitaplığı, destekleyebilecek .NET özelliklerinde sınırlıdır. Birden çok platformda çalışacak şekilde derlendiğinden [DllImport] , SQLite-NET'te kullanılan işlevlerden yararlanamaz. Bunun yerine SQLite-NET soyut bir sınıf olarak uygulanır ve paylaşılan kodun geri kalanı aracılığıyla başvurulur. Soyut API'nin bir ayıklaması aşağıda gösterilmiştir:

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();

}

Paylaşılan kodun geri kalanı, veritabanındaki nesneleri "depolamak" ve "almak" için soyut sınıfını kullanır. Bu soyut sınıfı kullanan herhangi bir uygulamada, gerçek veritabanı işlevselliğini sağlayan eksiksiz bir uygulama geçirmemiz gerekir.

TaskyAndroid ve TaskyiOS

iOS ve Android uygulama projeleri, PCL'de paylaşılan kodun kablolarını ayarlamak için kullanılan kullanıcı arabirimini ve platforma özgü diğer kodu içerir.

Bu projeler, bu platformda çalışan soyut veritabanı API'sinin bir uygulamasını da içerir. iOS ve Android'de Sqlite veritabanı altyapısı işletim sisteminde yerleşiktir, bu nedenle uygulama, veritabanı bağlantısının somut uygulamasını sağlamak için gösterildiği gibi kullanılabilir [DllImport] . Platforma özgü uygulama kodunun bir alıntısı burada gösterilmiştir:

[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);

Tam uygulama örnek kodda görülebilir.

Özet

Bu makalede Taşınabilir Sınıf Kitaplıklarının avantajları ve tuzakları kısaca ele alınmıştır, Mac için Visual Studio ve Visual Studio'nun içinden PCL'lerin nasıl oluşturulup tüketildiğini ve son olarak bir PCL'nin çalıştığını gösteren eksiksiz bir örnek uygulama (TaskyPortable) tanıtılmıştır.