De Silverlight/WPF à WinRT : .NET pour Metro Style (partie 3)

[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 !