[new:30/08/2012]Je vous ai déjà présenté différents éléments de WinRT, notamment ses différences avec les frameworks Silverlight et WPF. Soyons plus précis. Avec C#/Xaml il est possible de créer des applications Metro Style, ces applications fonctionnent sous WinRT, mais utilisent avant tout une version spéciale de .NET, un peu comme Silverlight. Et il y a beaucoup à dire sur les différences entre SL et .NET pour Metro Style.
.NET pour Metro Style
Avant tout, utiliser C# avec Xaml pour crĂ©er des applications Windows 8 câest utiliser une version spĂ©ciale et allĂ©gĂ©e de .NET, exactement comme le runtime Silverlight est lui aussi une version allĂ©gĂ©e du framework .NET complet. Seul WPF permet en rĂ©alitĂ© dâutiliser le framework complet (si on reste dans les applications Xaml).
Dans les comparaisons que jâai dĂ©jĂ publiĂ©es, on remarque que le framework .NET allĂ©gĂ© de Silverlight est presque totalement contenu dans celui disponible sous WinRT.
Mais de nombreuses et parfois subtiles différences existent.
Essayons de faire le tour des principales.
.NET APIs pour Metro Style
Câest le nom complet de ce framework .NET spĂ©cialement conçu pour concevoir des applications Metro Style en C# ou en VB.
Allégé ?
Oui pour au moins une bonne raison : tout ce qui ne permet pas directement de concevoir des applications Metro Style a été supprimé.
La rĂšgle est simple, prendre les dĂ©cisions classe par classe a forcĂ©ment du ĂȘtre moins simple. Câest pourquoi certains de ces choix nous apparaitrons Ă©vidents et logiques et dâautres plus difficiles Ă comprendre...
.NET APIs + WinRT
Lorsquâon travaille en C#/Xaml on utilise ainsi les APIs .NET pour Metro Style, APIs simplifiĂ©es et Ă©crĂ©mĂ©es de tout ce qui ne sert pas Ă faire du Metro Style. Mais tout cela repose malgrĂ© tout sur Windows Runtime (WinRT), et les types de WinRT sont aussi utilisables, en plus de ceux du framework .NET spĂ©cifique Metro Style...
Cela est trĂšs important Ă comprendre. Les APIs .NET pour Metro Style tournent au-dessus de WinRT qui lui-mĂȘme se prĂ©sente dâune façon semblable Ă .NET mĂȘme sâil a Ă©tĂ© conçu diffĂ©remment et toutes les APIs WinRT sont utilisables depuis C# comme on le faisait avec les APIs .NET. Mais cela est juste une impression, WinRT nâest pas un .NET modifiĂ©, câest autre chose, conçu autrement, mais se prĂ©sentant sous une forme semblable.
Ainsi, le dĂ©veloppeur utilisant C#/Xaml pour dĂ©velopper sous Windows 8 Metro Style (le bureau classique Ă part donc) dispose en rĂ©alitĂ© dâun ensemble dâAPIs sĂ©parĂ©es en deux groupes principaux : dâune part le framework .NET spĂ©cifique Metro Style, et dâautre part toutes les APIs WinRT. Câest donc un ensemble trĂšs vaste offrant lâaccĂšs Ă toutes les APIs utiles et nĂ©cessaires qui sâoffrent au dĂ©veloppeur C#/Xaml.
Ce nâest pas rien !
Un .NET allégé
Comme expliqué plus haut ce framework spécial pour Metro Style a été conçu avec un objectif clair : se concentrer sur tout ce qui est utile pour développer des applications Metro Style et rien que cela. Il en découle que certains types sont logiquement absent de ce framework:
- Les types et les membres qui ne peuvent pas servir à créer des applications Metro Style comme la Console ou les types ASP.NET.
- Les types obsolÚtes conservés uniquement pour la compatibilité avec les versions antérieures de .NET.
- Les types qui doublent des types existant dans les APIs WinRT.
- Les types et les membres qui encapsulent les fonctions de lâOS comme System.Diagnostic.EventLog ou les compteurs de performance.
- Les membres considĂ©rĂ©s comme introduisant une certaine confusion (comme les mĂ©thodes âClosesâ sur les types gĂ©rant des entrĂ©es/sorties).
Comme je le disais un tel dĂ©coupage Ă la hache, mĂȘme fait avec grande intelligence, possĂšde sa part dâombre. ll sera certainement aisĂ© de comprendre certains choix, et plus difficile dâen accepter dâautres. Mais tout comme le framework limitĂ© de Silverlight, il faudra faire avec.
Toutefois, si le dĂ©veloppeur Silverlight se trouvait devant un mur face Ă certaines omissions (comme les mĂ©thodes de coercition de donnĂ©es sur les propriĂ©tĂ©s de dĂ©pendance), le dĂ©veloppeur Metro Style aura souvent la possibilitĂ© de se ârabattreâ sur les types de lâAPI WinRT qui est plĂ©thorique (plusieurs milliers de types) alors que sous Silverlight un tel Ă©chappatoire nâexiste pas...
Toute lâastuce de lâapprentissage consistera donc Ă bien connaĂźtre les limites du framework .NET pour Metro Style tout autant que les APIs ânativesâ de Windows 8 (WinRT).
Des substituions Ă connaĂźtre
Si jâai dĂ©jĂ Ă©voquĂ© les changements de namespaces dans de prĂ©cĂ©dents billets, jâĂ©voque ici des substitutions plus subtiles, du type de celles qui rĂ©clament justement de bien connaĂźtre les APIs WinRT.
Par exemple le dĂ©veloppeur sera trĂšs Ă©tonnĂ© de ne plus trouver dans le framework .NET les APIs concernant lâIsolated storage.
Comment sâen passer ? Pourquoi ont-ils supprimĂ© ces types essentiels ?
On prend du recul, et on relit les rĂšgles... sont omis notamment âles types qui doublent des types existant dans les APIs WinRTâ...
Bien entendu WinRT fourni un service totalement Ă©quivalent Ă tous les langages de la plateforme. Il aurait Ă©tĂ© idiot de laisser des choses spĂ©cifiques dans le .NET pour Metro Style alors mĂȘme que WinRT fournit les mĂȘmes services de façon globale Ă toute la plateforme;
Câest ainsi que System.IO.IsolatedStorage.IsolatedStorageSettings est par exemple omis de .NET pour Metro Style car on peut accĂ©der tout aussi facilement Ă Windows.Storage.ApplicationDataContainer qui offre des services Ă©quivalents.
Une simplification de lâaccĂšs aux APIs
Lorsquâon créée une application Metro Style avec C#, la totalitĂ© des APIs est automatiquement rĂ©fĂ©rencĂ©e dans le projet. On peut dĂšs lors utiliser directement nâimporte quel type supportĂ© par .NET Metro Style dans actions supplĂ©mentaires.
Créer des librairies Metro Style portables
Vous pouvez Ă©galement crĂ©er un projet de classe Portable pour dĂ©velopper une bibliothĂšque. NET Framework qui pourra ĂȘtre utilisĂ©e Ă partir d'une application Metro Style (peu importe son langage) ou mĂȘme dâapplications WPF en bureau classique ! Le projet doit inclure. NET pour Metro Style comme l'un des plates-formes cibles (si on souhaite un partage avec cette plateforme bien entendu). La bibliothĂšque de classes portable est particuliĂšrement utile lorsque vous voulez dĂ©velopper des classes qui peuvent ĂȘtre utilisĂ©s Ă partir d'applications pour diffĂ©rents types de plates-formes, comme une application Windows Phone, une application de bureau, et une application Metro Style.
Ces librairies âportablesâ sont une nouveautĂ© et peuvent sâavĂ©rer essentielles pour qui dĂ©sire dĂ©velopper un logiciel tournant sous WinRT et WPF ou Windows Phone 7.x et WPF, etc...
La conversion du code existant
Partir de zĂ©ro sur une nouvelle plateforme est certainement le meilleur moyen de âfaire propreâ, mais puisquâici nous sommes sur des plateformes âcousinesâ Ă©tudiĂ©es pour ĂȘtre compatibles entre elles (jusquâĂ un certain point), il est tout Ă fait envisageable de vouloir porter un code existant, WPF ou Silverlight, vers WinRT.
Je parle de âcousinageâ car comme un cousin germain, sâil existe une âproximitĂ© gĂ©nĂ©tiqueâ indĂ©niable, les diffĂ©rences sont suffisamment importantes pour ĂȘtre visibles... Ainsi lors dâun portage vers WinRT il faudra veiller Ă de nombreuses diffĂ©rences qui se cachent derriĂšre la masse des similitudes, car il y a des changements dans :
- La gestion de lâinterface utilisateur;
- La gestion des Entrées/Sorties;
- La gestion du réseau;
- La maniĂšre dont le multitĂąche fonctionne;
- La gestion des mécanismes de réflexion;
- La gestion de la sécurité;
- La gestion des ressources;
- La façon dont WCF fonctionne et réagit;
- A lâintĂ©rieur mĂȘme de certains types .NET
Les changement dans la gestion de lâinterface utilisateur
La conversion dâun code dâinterface depuis Silverlight nâest pas si difficile du point de vue UI car les bases restent identiques. Jâai pu, dans mes expĂ©riences, transfĂ©rer des UserControls avec leurs styles, des templates, etc, sans rencontrĂ©s dâĂ©normes problĂšmes et mĂȘme avec parfois une facilitĂ© qui mâa Ă©tonnĂ©e.
La diffĂ©rence premiĂšre est le stockage des types habituels qui passe de System.Windows Ă lâespace de noms Windows.UI.Xaml.
Les types sont similaires mais il y a parfois des diffĂ©rences dans les membres. Ce genre de âsurpriseâ se dĂ©couvre dans lâaction et il serait fastidieux dâen dresser la liste complĂšte...
Le premier point à se rappeler est donc de changer toutes les références à System.Windows.* par Windows.UI.Xaml.*. Ainsi la classe Border se trouve désormais dans Windows.UI.Xaml.Controls au lieu de System.Windows.Controls.
Pas trop compliquĂ© surtout si, comme la plupart du temps, les espaces de noms sont indiquĂ©s une fois pour toute en entĂȘte de code par le biais dâune instruction âusingâ. Seul cet endroit du code devra donc ĂȘtre modifiĂ©.
Les changements dans la gestion des Entrées / Sorties
Ici les changements sont radicaux car tout dans WinRT est asynchrone. C# 5 introduit des nouveaux mots clĂ© âasyncâ et âawaitâ dont je reparlerai bien Ă©videmment et qui simplifient grandement la prise en charge de lâasynchronisme. Il nâen reste pas moins vrai que toutes les opĂ©rations dâE/S sont devenus asynchrones et rĂ©clameront dâĂȘtre ârevisitĂ©esâ parfois en profondeur.
Par exemple la lecture des flux via les méthodes System.IO.Stream.BeginRead/EndRead est remplacée par une unique méthode System.IO.Stream.ReadAsync, totalement asynchrone.
Dans le mĂȘme esprit les Ă©critures sur un flux (BeginWrite/EndWrite) sont remplacĂ©s par un unique WriteAsync.
La mĂ©thode âClose()â a souvent fait couler beaucoup dâencre. Un fichier, par exemple, une fois sa mĂ©thode Close() appelĂ©e, est-il âdisposĂ©â ou non ? Peut-on directement appeler Dispose() ? Etc. Lâenfer est pavĂ© de bonnes intentions... Câest en voulant simplifier les choses du point de vue sĂ©mantique que Close() a Ă©tĂ© ajoutĂ© (en pur Ă©quivalent Ă Dispose()). Mais câĂ©tait une fausse bonne idĂ©e. Sous WinRT les mĂ©thodes Close() nâexistent plus, reste toujours Dispose(). On peut appeler Dispose() directement, dans un bloc try/finally, ou mieux dans un bloc âusingâ.
Par exemple la lecture dâun flux sous WinRT, en prenant en compte lâasynchronisme, sâĂ©crira de la façon suivante :
using (StreamReader sr =
new StreamReader(await passedFile.OpenStreamForReadAsync()))
{
while ((nextLine = await sr.ReadLineAsync()) != null)
{
contents.Append(nextLine);
}
}
On voit clairement lâutilisation dâun bloc âusingâ tel quâil Ă©tait de toute façon conseillĂ© dâen utiliser partout oĂč lâon travaillait sur des objets offrant une mĂ©thode Dispose() ayant un rĂŽle rĂ©el (libĂ©rer des ressources non managĂ©es occupĂ©es par lâinstance).
On remarque lâutilisation de âawaitâ qui allĂšge considĂ©rablement lâasynchronisme.
Autre problĂšme rĂ©curent, la lecture dâun fichier texte. Lorsquâil nâest pas trop long on utilise souvent System.IO.File.ReadAllText, sous WinRT on utilisera Windows.Storage.PathIO.ReadTextAsync.
Lâexemple suivant lit deux fichiers texte, lâun se trouvant dans le package du logiciel, lâautre se trouvant dans le rĂ©pertoire local de lâapplication :
public static async void ReadFileSamples()
{
// Read a file from package
StorageFolder packageFolder =
ApplicationModel.Package.Current.InstalledLocation;
StorageFile packagedFile =
await packageFolder.GetFileAsync("FileInPackage");
// Read a file from AppData
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFile localFile =
await localFolder.GetFileAsync("FileInAppData");
}
Nous noterez que ces exemples, comme le squelette de cet article, sont puisés du site de la documentation temporaire de WinRT.
On remarque une fois encore lâutilisation de âawaitâ et des mĂ©thodes dont le nom se termine par âasyncâ. Absolument toutes les I/O sont asynchrones sous WinRT.
Lâisolated Storage
Puisque nous parlons des E/S et de portage depuis Silverlight, il est important de noter la diffĂ©rence dans la gestion de lâIsolated Storage.
(Ce problĂšme ne se pose pas pour un portage depuis WPF puisque ce dernier nâa pas dâĂ©quivalent Ă lâIsolated Storage, mais en revanche si on veut Ă©crire un code portable SL / WinRT / WPF il faudrait forcĂ©ment faire attention Ă âsimulerâ ce fonctionnement pour WPF).
Sous .NET pour Silverlight on utilise la classe System.IO.IsolatedStorageFile, sous WinRT on utilisera la propriété LocalFolder de Windows.Storage.ApplicationData.
De mĂȘme System.IO.IsolatedStorage.IsolatedStorageSettings sera remplacĂ© par la propriĂ©tĂ© LocalSettings de Windows.Storage.ApplicationData.
On noter au passage que les espaces de noms de WinRT suivent une logique diffĂ©rente de .NET mais quâon gagne un peu, en tout cas Ă mon avis, en intelligibilitĂ©. Tout ce qui concerne les E/S se trouve dans Windows.Storage par exemple. Câest clair. Les donnĂ©es de lâapplication sont dans Windows.Storage.ApplicationData, câest ultra clair. ForcĂ©ment, avec le recul, Microsoft a pu retravailler certains aspects comme le nommage des espaces de noms et nous gagnons en cohĂ©rence au passage.
Les changements dans la gestion du réseau
LĂ aussi les changements sont radicaux et demanderont de revisiter le code. Dâabord en raison de la nature asynchrone des nouvelles APIs et parce que ces derniĂšres ont une philosophie un peu diffĂ©rente.
AInsi, les Ă©changes en lecture et Ă©criture via Http utilisent sous Silverlight la classe System.Net.WebClient alors que sous WinRT il sâagira de System.Net.Http.HttpClient. Un nom plus parlant quand aux techniques utilisĂ©es.
WinRT propose dâailleurs une autre API destinĂ©e aux uploads et downloads de grandes quantitĂ©s de donnĂ©es : Windows.Networking.BackgroundTransfer. Ici aussi les noms clarifient lâintention. On comprend immĂ©diatement quâil sâagira de transfĂ©rer des donnĂ©es dans un thread dâarriĂšre-plan. Ce qui, bien entendu, est mieux adaptĂ© lorsquâil sâagit de communiquer des donnĂ©es de taille importante.
Autre changement, tous les types qui se trouvent dans System.Net.Sockets se retrouvent dans Windows.Networking.Sockets.
Parmi les diffĂ©rences qui peuvent avoir un impact non nĂ©gligeable on remarquera aussi que les URI relatives ne peuvent pas ĂȘtre passĂ©es au classes de WinRT qui rĂ©clame des adresses absolues. Cela peut ĂȘtre dĂ©licat pour certains codes.
Un dernier aspect concerne la gestion des exceptions. UriFormatException doit ĂȘtre changĂ©e dans les âcatchâ par FormatException qui est la classe parente de UriFormatException. Ne cibler que cette derniĂšre semble laisser des âtrousâ. En utilisant la classe parente on est certain dâattraper toutes les exceptions que Silverlight gĂšre (plus celles propres Ă WinRT certainement dans ce cas).
Les changements dans la gestion du multitĂąche
Certaines classes de gestion du multitĂąche du framework .NET connaissent des changements dans leurs membres, ce qui peut sâavĂ©rer dĂ©licat Ă gĂ©rer. Certaines ont totalement disparu... mais heureusement, câest quâici aussi on retrouve un Ă©quivalent gĂ©rĂ© par WinRT quâil est possible dâutiliser. Mais cela modifie le code ce qui a un poids non nĂ©gligeable dans le cas dâun portage.
Toutefois il faut relativiser certains changements qui concernent des propriétés peu utilisées comme MemoryBarrier de la classe Thread ou ManagedTheadId.
Plus dĂ©routant peut ĂȘtre lâabsence de Thread.CurrentCulture ou CurrentUICulture quâon retrouve dans CultureInfo de lâespace de noms System.Globalization. Mais je trouve quâici aussi on gagne en cohĂ©rence. Que des aspects liĂ©s Ă la localisation soient âcachĂ©sâ dans une classe telle que Thread relĂšve plus de lâastuce que de la bonne Ă©criture dâun framework... Alors que retrouver ces informations dans System.Globalization est dâune logique imparable. Mais chacun apprĂ©ciera !
La disparition de System.Threading.Timer ne doit pas vous affoler non plus. On retrouve un Ă©quivalent en la classe ThreadPoolTimer de Windows.System.Threading. De mĂȘme que la classe System.Threading.ThreadPool se trouve dĂ©placĂ©e dans Windows.System.Threading.
Pour placer un code dans le pool on utilisera un code structuré de cette façon :
Task.Run(() =>
{
// job Ă faire ici
});
Un code qui place un job dans le pool et qui souhaite attendre sa fin :
await Task.Run(() =>
{
// job à exécuter et à attendre ici
});
On remarque lâĂ©tonnante simplicitĂ© quâintroduisent âasyncâ et âawaitâ.
Pour un code qui créé un job pouvant ĂȘtre long on utilisera la construction suivante :
Task.Factory.StartNew(() =>
{
// long job ici
}, TaskCreationOptions.LongRunning);
Les changements dans la gestion de la réflexion
Les changements ne sont pas immenses mais la plupart des membres de System.Type ont été déplacés dans System.Reflection.TypeInfo ce qui malgré tout impact de façon non négligeable un code à porter.
Type.Assembly se retrouve par exemple dans type.GetTypeInfo().Assembly, ce nâest pas compliquĂ© mais encore faut-il retrouver cette Ă©quivalence !
De mĂȘme type.GetMethod(âmaMĂ©thodeâ, BindingFlags.DeclaredOnly) se retrouve par type.GetTypeInfo().GetDeclaredMethod(âMaMĂ©thodeâ). Dans la mĂȘme logique type.GetNestedTypes() sâobtient par type.GetTypeInfo().DeclaredNestedTypes.
Si tous ces changements obligent Ă revoir le code existant, on notera quâun simple âchercher/remplacerâ pourra faire le travail dans la majoritĂ© des cas et que dans les autres il sâagit de mĂ©thodes ou de membres peu utilisĂ©s (en tout cas souvent utilisĂ©s dans des parties de code trĂšs ciblĂ©es ce qui en facilite le changement).
Les changement dans la gestion de la sécurité
Ici presque tout a Ă©tĂ© supprimĂ© car WinRT fournit bien entendu Ă lâensemble de la plateforme et de façon homogĂšne tout ce qui est nĂ©cessaire Ă la gestion de la sĂ©curitĂ©, aux authentifications ou Ă la cryptographie.
Il sera donc nĂ©cessaire dâĂ©tudier de prĂšs les espaces de noms suivants pour retrouver les Ă©quivalents :
Les changements dans la gestion des ressources
Dans les applications Metro Style ont créé un fichier unique de ressources ce qui est une philosophie diffĂ©rente des applications desktop gĂ©nĂ©ralement. Je reviendrai sur tous ces aspects dans de prochains billets bien entendu, il ne sâagit, pour lâinstant, que de dĂ©broussailler le chemin...
On notera que les classes de WIndows.ApplicationModel.Resources et Windows.ApplicationModel.Resources.Core sont Ă utiliser Ă la place de celles de System.Resources.
Les changements dans la gestion des exceptions
Dans certains cas un type managĂ© peut lever une exception qui nâest pas incluse dans le framework .NET pour Metro Style, ce qui créé des situations assez dangereuses si des âcatchâ ont Ă©tĂ© placĂ©s sur ces exceptions particuliĂšres.
Lâastuce, si on peut parler dâastuce, consiste Ă âcatcherâ la classe parente de lâexception en question... câest le conseil de Microsoft, je trouve cela un peu bricolage et dangereux, mais il faudra faire avec...
Un exemple a Ă©tĂ© Ă©voquĂ© plus haut Ă propos de UriFormatException. Sâil faut utiliser la classe parente FormatException câest tout simplement que UriFormatException est levĂ©e par une partie du code managĂ©e mais quâelle nâexiste pas dans le framework .NET Ă©purĂ© pour Metro Style. Situation curieuse, ambigĂŒe et pour parler franchement trĂšs âcasse gueuleâ. MĂ©fiez-vous et vĂ©rifiez bien vos âcatchâ !
Les changements dans WCF
En fait les changements se résume à un seul changement, mais de taille : dans une application Metro Style on peut utiliser tous les services de WCF pour obtenir des données mais il est impossible de créer un service WCF pour servir des données... Radical !
Câest ce genre de choses qui expliquent, imposent mĂȘme, la crĂ©ation du premier OS Ă deux tĂȘtes au monde... Et câest pourquoi Windows 8 Metro Style est fait pour cohabiter longtemps avec le bureau classique... Metro Style ne permet pas dâĂ©crire de nombreux types dâapplications, le bureau classique reste indispensable dans certains cas. Metro Style a Ă©tĂ© conçu pour des applications grand public puisant leurs donnĂ©es dans le Cloud, absolument pas dans lâoptique de crĂ©er une plateforme du futur remplaçant lâancienne... Et câest pour moi tout le problĂšme de Windows 8 : des idĂ©es gĂ©niales, de vraies innovations, mais poussĂ©es tellement Ă lâextrĂȘme quâon se retrouve obligĂ© dâavoir un OS bicĂ©phale ce qui est une perte de cohĂ©rence Ă©norme, voire une erreur de design impardonnable.
Les changements dans les types .NET
Ils sont assez nombreux malgrĂ© tout et Ă©parpillĂ© un peu partout. Ils seront souvent simples Ă repĂ©rer puisque lâavantage dâun langage comme C# sur JavaScript notamment (vous voyez Ă quel buzz je pense...) permet de sâassurer Ă la compilation que tout est ok. On imagine quel serait lâenfer de tels changements dans le futur pour ceux qui auraient choisi un langage non fortement typĂ© et non compilĂ©...
Visual Studio saura vous avertir avant mĂȘme la compilation que System.Xml.XmlConvert.ToDateTime nâest plus accessible. Pas de possibilitĂ© de laisser le soft planter chez le client âun jourâ quand la fonction sera appelĂ©e. En revanche il vous faudra chercher un peu pour savoir quâil faut utiliser Ă la place XmlConvert.ToDateTimeOffset car ici le nom change aussi.
Il sera assez rapide de sâapercevoir aussi que System.ICloneable nâexiste plus, le code sera rejetĂ©. Ecrire une mĂ©thode ad hoc qui retourne le bon type sera la seule solution. Mais cela ne devrait pas trop couter puisquâil suffira de reprendre le code créé pour supporter ICloneable.
Vous dĂ©couvrirez dâautres changements... Le site que je vous ai proposĂ© dans un billet prĂ©cĂ©dent et qui sâefforce de lister les Ă©quivalences entre Silverlight et WinRT devrait vous aider Ă trouver la parade (voir le billet sur WinRT Genome Project).
Conclusion
Pareil / pas pareil ... ? That is the question !
Beaucoup de similitudes, beaucoup de petits et parfois grands changements entre Silverlight et WinRT.
Ecrire un code portable entre les deux environnements sera certainement plus facile que de porter un code existant. Quand on sait quâil y a des diffĂ©rences on prĂ©voit son code en consĂ©quence, quand on reprend un code qui âne savait pasâ quâil y aurait des changements câest parfois toute sa structure qui est Ă revoir.
Mais malgrĂ© tout, soyons honnĂȘtes, lâeffort de compatibilitĂ© entre Silverlight et WinRT est gigantesque.
Tous ceux qui avaient choisi le couple C# / Xaml pour dĂ©velopper seront ravis de voir que 95% de leur savoir-faire reste totalement utile et dâactualitĂ©.
Il reste Ă Windows 8, lâOS Ă deux tĂȘtes, Ă sĂ©duire autant le grand public que les directions informatique.
Personnellement je serai enclin, spontanĂ©ment, Ă prĂ©fĂ©rer encore Silverlight pour tout ce qui est de type intra et extranet en entreprise notamment. Mais finalement, Metro Style nâest pas un mauvais choix...si on a dĂ©cidĂ© de passer Ă Windows 8 tout le parc informatique de lâentreprise !
Sinon le choix de WPF semble sâimposer pour tout logiciel qui ne peut supporter les limitations de WinRT, le Windows store et la sandbox. Jâai toujours aimĂ© WPF. Jâai adorĂ© Silverlight. Mais jâaime toujours WPF. Je renverrai le lecteur qui connaitrait mal WPF vers cet article de 2008 â10 bonnes raisons de choisir WPFâ ou mĂȘme â9 raisons de plus dâutiliser WPFâ de 2009. Ca commence Ă dater, mais finalement lâhistoire nâĂ©tant quâun Ă©ternel recommencement, la chute de Silverlight ravive tout lâintĂ©rĂȘt de WPF dans bien des cas, mĂȘme sous Windows 8 !
Pour les applications grand public en revanche, Metro Style est le choix le plus intelligent, si on dĂ©sire suivre Microsoft dans son grand âshiftâ... Mais lorsquâon voit lâindigence des outils de dĂ©veloppement pour Java, Html 5, Android ou iOS comparativement Ă des monstres (gentils) comme Visual Studio et Expression Blend, franchement, Ă moins dâĂȘtre masochiste et quâon soit ou non dâaccord avec la totalitĂ© de la nouvelle dĂ©marche de Microsoft, il faudrait ĂȘtre fou pour ne pas choisir la voie Metro Style et WinRT...
A bientĂŽt pour les suites de cette aventure sur les terres de Windows 8,
Stay Tuned !