Dajbych.net


Portable Libraries – jedna knihovna pro všechny platformy

, 9 minut čtení

Portable Class Li­brary je uni­verzální .NET kni­hovna. Je užitečná pro sdílení kódu napřík­lad mezi WPF, Win­dows Phone a Metro style ap­likacemi. Může ob­sa­ho­vat vše, co je pro plat­formy, pro které je určená, společné. Díky do­plňku pro Vi­sual Stu­dio 2010 je možné ji začít použí­vat ihned. Je­likož se plat­forma .NET poslední roky poněkud tříští, je Portable Li­brary velmi ví­taný tmelící prvek. Už není nutné kom­pilo­vat kni­hovny pro různé .NET plat­formy.

Úvod

Dříve byl jen .NET Frame­work. Po čase se však ob­jevil Sil­verlight, poté Win­dows Phone, za ním Xbox 360 a nyní nas­tupuje Win­dows Run­time. To už je 5 různých plat­forem, na kterých běží .NET. Pro­tože je však každá plat­forma svým způ­sobem značně speci­fická, jsou typy na každé z nich vždy trošku odlišné. Asi nemá smysl, aby Xbox 360 pod­poroval touch jako Metro style ap­likace nebo ob­sa­ho­val pod­poru pro Win­dows Forms. Win­dows Phone pro svůj SQL Server Com­pact nepotře­buje mo­hutný ADO.NET a En­tity Frame­work, ale vys­tačí si tenčí vrstvou, která dokáže Code-First přístup a pod­poru LINQ zprostřed­ko­vat také. Sil­verlight musí mít úplně jiné třídy pro přístup k sys­tému souborů. Portable Li­brary dovoluje zvolit si plat­formy, pro které chceme vyví­jet. Máme poté k dis­pozici vše, co mají tyto plat­formy společné. Kni­hovna pak běží na všech zv­olených plat­for­mách.

.NET

Často se vytváří jedna ap­likace pro něko­lik plat­forem. Portable Li­brary typ­icky ob­sahuje kód, který by byl ve všech pro­filech ste­jný a je potřebný na každé z nich. Ne­jedná se o uži­va­tel­ské rozhraní, pro­tože každé zařízení ho má odlišné, ale přede­vším hlavní logiku ap­likace. Portable Li­brary je ze­jména pro Model a View­Model a může také ob­sa­ho­vat ref­erenci na službu.

.NET

Použití

Portable Li­brary jde použít pro Sil­verlight, Xbox 360, Win­dows Phone 7, Win­dows Phone 8, Win­dows Run­time (Win­dows Metro style ap­likace) a velký .NET Frame­work. Portable Class Li­brary ne­jde cílit na .NET Mi­cro Frame­work a SQL Server CLR. Pro­jekt s Portable Li­brary je pak možné otevřít jak ve Vi­sual Studiu 2012, tak i ve 2010, je však potřeba doin­stalo­vat do­pl­něk Portable Li­brary Tools 2 od Base Class Li­brary týmu.

.NET

Po in­sta­laci do­plňku se ob­jeví nový typ pro­jektu.

.NET

Při jeho vytváření je ne­jprve nutné zvolit si pro­fily, pro které chceme vyví­jet.

.NET

V lednu 2011 byla uvol­něna první verze pro Vi­sual Stu­dio 2010. Umožňo­vala zák­ladní funk­cion­al­itu, která měla být dostatečně při­tažlivá pro vývo­jáře, aby jí zkusili a poslali zpět­nou vazbu BCL týmu.

.NET

Druhá verze pro Vi­sual Stu­dio 2010 z května 2012 už se možnos­tmi neliší od té, která je ve Vi­sual Studiu 2012.

.NET

Ve Vi­sual Stu­dio 2012 je pod­pora už zabu­dovaná.

Co je podporováno

Fea­ture AreaSil­verlight 4Sil­verlight 5Win­dows Phone 7Win­dows Phone 7.1Metro Style Apps.NET Frame­work 4.NET Frame­work 4.0.3.NET Frame­work 4.5XBOX 360
Core XML
LINQ
IQueryable
dy­namic key­word sup­port
Core WCF
Core Net­work­ing
View Models
Data An­no­ta­tions
XLINQ
MEF
Data Con­tract Se­ri­al­iza­tion
XML Se­ri­al­iza­tion
JSon Se­ri­al­iza­tion
Sys­tem.Nu­mer­ics
Task<T> sup­port

Architektura s Portable Library

Zák­ladní prin­cip spočívá ve vytvoření ab­s­trak­tní třídy, která před­s­tavuje Model. Má im­ple­men­továno vše, co je pro všechny plat­formy společné. Tento model je umístěn v Portable Li­brary. V ní je také View­Model, který má v kon­struk­toru parametr, kterým se předává ref­er­ence na konkrétní model z konkrétní plat­formy, který dědí z ab­s­trak­t­ního modelu.

V praxi to však není tak jedn­oduché. Klíčová slova async a await typ­icky nez­nají všechny platformy, na které je potřebujeme cílit. Proto potře­bu­jeme další rozhraní. Vytvořil jsem demo, které ilus­truje zák­ladní prin­cip. Děkuji Danielovi Plaiste­dovi za poskyt­nutí zdro­jových kódů k task wrap­perům.

Zdro­jové kódy dema ke stažení.

Jak to funguje

Profily

.NET

Ne­jběžnější pro­fil, se kterým se asi většina pro­gramá­torů setkala, je .NET Frame­work Client Pro­file. Je to podm­nožina .NET Frame­worku pro ap­likace na straně klienta. Neob­sahuje ASP.NET, ale ob­sahuje Win­dows Forms a WPF. Sil­verlight je však plat­form pro­file, pro­tože ob­sahuje na rozdíl od velkého .NET Frame­worku rozdíl­nou im­ple­mentaci. Ob­sahuje odlišný ms­core­lib.dll. Ste­jně je na tom také Win­dows Phone.

Pro­fil je reprezen­tován množi­nou ref­er­ence as­sem­blies. Tyto as­sem­bly neob­sahují in­strukce IL (In­ter­me­di­ate Lan­guage), ale ob­sahují jen meta­data. Překladač potře­buje meta­data aby věděl, která volání může ap­likace uskutečnit. Ref­er­ence as­sem­blies pro Metro style (Win­dows Run­time) pro­fil naleznete v adresáři C:\Pro­gram Files (x86)\Ref­er­ence As­sem­blies\Mi­crosoft\Frame­work\.NET­Core. Spatříte v něm ms­core­lib.dll a System.Col­lec­tions.dll. Proč je ale tato kni­hovna zvlášť, když jsou kolekce im­ple­men­to­vané v ms­core­lib.dll? Plat­forma .NET se sk­ládá z něko­lika vrstev, které jsou od sebe velmi pečlivě od­děleny. Napřík­lad ms­core­lib není závislý na ASP.NET. Pos­tu­pem času, jak pos­tupně přibý­vala prostředí, kde se .NET uplatňuje, se ukázalo, že by bylo do­bré něk­teré prvky rozdělit a umístit do různých vrstev. Pro­fily se snaží tento ne­dostatek napravit. Proto jsou System.Col­lec­tions.dll a System.Re­flec­tion.dll od­děleny od Sys­tem.Run­time.dll (což je nový název pro ms­core­lib.dll).

Fragmentace platforem

Různé .NET plat­formy mají mnoho společného, ale také se zásadně liší. Sil­verlight má odliš­nou im­ple­mentaci ms­core­lib. Xbox 360 je založen na .NET Com­pact Frame­worku. Velký .NET ob­sahuje ASP.NET, který jinde, napřík­lad na Win­dows Phone, nemá smysl.

Plat­formy se vzá­jemně liší ze­jména uži­va­tel­ským rozhraním. Rozhraní INo­ti­fyProp­er­ty­Changed je já­dro View­Modelu. V Sil­verlight je umístěno v kni­hovně System.Win­dows.dll, v .NETu však v kni­hovně Sys­tém.dll. MEF (Man­aged Ex­ten­si­bil­ity Frame­work) se vysky­tuje jak ve velkém .NETu, tak i v Sil­verlightu. Ne­naleznete ho však v Xboxu 360 a ve Win­dows Phone. Pokud je odškrt­nete, můžete pro­gramo­vat moduly. Jak­mile zaškrt­nete Xbox 360, přicházíte o net­work­ing stack.

Využití původní funkcionality pro .NET Compact Framework

Strong type ob­sahuje jméno as­sem­bly, číslo její verze, hash veře­jného klíče použitého k je­jímu pod­pisu a re­tar­getable bit. Ten se využí­val pro schop­nost běhu ap­likace napro­gramované proti .NET Com­pact Frame­worku na desk­topu, kde je velký .NET Frame­work. Tento bit je důležitý pro CLR, který ob­sahuje pevně zakó­dovanou tab­ulku říka­jící: „Pokud uvidíš as­sem­bly A s nas­taveným re­tar­getable bitem, tak místo ní použij as­sem­bly B.“

Pokud Portable Li­brary ob­sahuje ref­erenci na Sys­tem.Net.dll, která ob­sahuje net­workign stack, je re­tar­getable flag nas­taven. V Sil­verlightu tato kni­hovna ex­is­tuje, ale ve velkém .NETu je její funk­cion­alita přímo v Sys­tem.Core.dll. Proto je potřeba vytvořit stínovou as­sem­bly, která bude jen od­ka­zo­vat na typy umístěné v jiné as­sem­bly.

Type forwarding

Type for­ward­ing je to, díky če­muž fun­gují pro­fily. As­sem­bly ne­musí ob­sa­ho­vat typ samotný i s jeho im­ple­men­tací, ale namísto toho může ob­sa­ho­vat jen typ s meta­daty, které říkají, kde se ve skutečnosti daný typ nachází. Portable Li­brary se tady pro­gra­muje proti pro­filu. Naleznete ho v adresáři C:\Pro­gram Files (x86)\Ref­er­ence As­sem­blies\Mi­crosoft\Frame­work\.NET­Portable. Tyto kni­hovny jsou sice tech­nicky as­sem­bly, ale ob­sahují pouze meta­data. Portable Li­brary vlastně neob­sahuje ref­er­ence na konkrétní kni­hovny (i když tech­nicky tomu tak stále je), ale ref­erenci na kni­hovnu s meta­daty. To­muto typu ref­er­ence se říká API Con­tract.

TypeRef, TypeSpec a TypeDef

Pokud ně­jaká as­sem­bly A používá ně­jaký typ z jiné as­sem­bly B, ob­sahuje ve skutečnosti jen TypeRef. TypeRef ukazuje na Type­Spec, který popisuje daný typ a nachází se v as­sem­bly s meta­daty, oproti které je as­sem­bly A zkom­pilo­vaná. As­sem­bly B, která se nachází na konkrétní plat­formě, ob­sahuje TypeDef, který je svázaný s Type­Info. Type­Spec ob­sahuje dostatek in­for­mací k pop­sání typu, ale neob­sahuje jich to­lik jako Type­Info. CLR se stará o provázání Type­Spec z pro­filu s TypeDef z plat­formy. Toto zave­dení Type­Spec a TypeDef je ne­jvětší viditelná změna v .NET Frame­worku za poslední ob­dobí. Do­voluje por­table kni­hovnám běžet i na plat­for­mách, které vyj­dou i v budoucnu, pokud bu­dou podm­nožinu, proti které je Portable Li­brary napro­gramována, ob­sa­ho­vat.