Category Archives: C#

3 aprile 2012 – Asynchronous Development in .NET 4.0 e 4.5

Martedì 3 aprile 2012 sarò a Milano per tenere un’intera giornata sulla programmazione asincrona con .NET 4.0 e 4.5. Ho ricevuto alcune richieste relativamente ai prerequisiti e ho pensato che scrivere un post con qualche informazione in più su questa giornata può sempre tornare utile (anche solo per rispondere più velocemente a richieste simili!).

Chi ha visto la mia sessione Asynchronous Programming in CLR 4.5 ai Community Days ha probabilmente già visto la fine della giornata… e proprio per questo potrebbe avere molti motivi per venire! Capire bene come funziona la programmazione asincrona nella prossima versione di .NET richiede la consapevolezza dei meccanismi sottostanti, basati su ciò che esisteva in .NET 1/2 e ora sulle nuove librerie introdotte in .NET 4.0. L’obiettivo della giornata è quindi quello di fornire una visione completa di tutte le librerie e le tecniche a disposizione oggi con .NET Framework, nonché dei concetti di base del sistema operativo che, volenti o nolenti, guidano anche le funzionalità ottenute a livello più alto (come i Task) con .NET 4.0 e 4.5. Non mancheranno poi abbondanti riferimenti alla piattaforma Win32, che è poi la base di quasi tutte (ma non tutte) le altre librerie. Come sempre, ci vuole poi molto esercizio per imparare e adottare nell’uso quotidiano tutte queste nuove tecnologie, ma una giornata come questa è certamente il miglior modo di cominciare.

Le iscrizioni sono ancora aperte – arrivederci a Milano!

Sviluppare con Windows 8

BUILD Windows è la conferenza conclusa da poco in cui Microsoft ha presentato agli sviluppatori Windows 8. Una nuova interfaccia utente, nuove API e nuovi strumenti di sviluppo. Con qualche discontinuità rispetto all’esistente. DevCon Conference 2011 è l’evento di un giorno che faremo il 25 ottobre 2011 a Milano per riassumere le novità e valutarne l’impatto sulle applicazioni esistenti e future. Abbiamo un mese per preparare tutto il materiale, ma ci sono già alcune considerazioni che è possibile fare su quanto appena presentato.

Le novità sono molteplici e non riguardano soltanto quello che vede l’utente. Alla classica interfaccia “a finestre”, chiamata non a caso “Desktop” perché ricalca la metafora della scrivania con documenti, cartelle e finestre personalizzabili che definiscono un’area di lavoro, Windows 8 introduce una nuova interfaccia adatta all’uso su dispositivi senza tastiera, basati prevalentemente su un’interfaccia multi-touch. Avrete sicuramente già letto molti commenti entusiasti delle novità della nuova piattaforma, mi dilungherò quindi su alcuni degli aspetti più controversi e che hanno suscitato le maggiori critiche e preoccupazioni (molte infondate, ma non tutte).

Molti di noi si sarebbero aspettati un’evoluzione della piattaforma esistente, basata magari su .NET, con nuove linee guida e oggetti per l’implementazione dell’interfaccia utente. La scelta è stata diversa. Windows 8 ha una nuova API a livello di sistema operativo chiamata Windows Runtime (WinRT) che definisce un layer alternativo all’interfaccia Windows e alle API Win32. Questa API è a oggetti, espone metadati che semplificano la ricerca di metodi e classi, integra funzionalità per la sicurezza nell’accesso ai dati e a determinati servizi del sistema operativo, un po’ come .NET ci ha abituato. Ma questa API è codice nativo, non è basata su .NET, non richiede di avviare il runtime di .NET per eseguire un’applicazione.

WinRT può essere utilizzato in maniera “naturale” da C++, C#/VB, JavaScript. Questa è una vera “rivoluzione” per C++ e JavaScript, ma può sembrare un passo indietro per il mondo managed. L’impressione va però mediata. Oggi il mondo .NET dialoga con il sistema operativo attraverso P/Invoke, con la necessità di convertire molti dei parametri trasferiti tra il mondo managed e il mondo unmanaged per soddisfare una diversa rappresentazione binaria. Questo ha un costo, nelle applicazioni che esistono oggi. Con WinRT questa situazione non è eliminata del tutto, ma viene migliorata in molti aspetti. Resta un sistema operativo con API unmanaged, che trova il massimo dell’efficienza in applicazioni scritte in C++, e aggiunge un piccolo overhead (minore che in passato) quando usato da altri ambienti, come .NET e JavaScript.

Questa è solo la base di partenza per descrivere i cambiamenti che avverranno con Windows 8. Il discorso è molto ampio e riveste tutti gli aspetti degli attuali ambienti di sviluppo per il client, managed (WPF, Silverlight, Windows Forms) e unmanaged (MFC, ATL, Win32). È semplicemente impossibile pensare che in meno di 10-15 anni tutto il codice esistente possa essere convertito alle nuove API. Soprattutto, è forse insensato che succeda, perché l’interfaccia Metro è perfetta per l’uso sui Tablet e anche come “porta d’ingresso” per molte delle attività da fare su un PC. Ma è assolutamente prematuro decretare con questo la “fine” delle applicazioni Windows così come le conosciamo. Un aspetto è l’enorme inerzia del mercato esistente, ma più importanti sono le differenze funzionali esistenti. Posso immaginare una versione di Office con interfaccia Metro. Ma a essere ottimisti, posso pensare a un sottoinsieme delle funzionalità disponibili con tale interfaccia, un po’ come oggi, con le Office Web Apps, sono disponibili solo una parte delle funzionalità degli applicativi Office.

Personalmente non ho ancora formulato un’opinione completa. Per certi aspetti, finalmente Microsoft fa una mossa “coraggiosa” nel “cuore” del sistema operativo. Avvicinandosi ai dettagli, molti servizi sono semplicemente la riesposizione degli attuali servizi Win32, semplicemente perché non hanno avuto tempo di “rifare” alcune cose, e l’esistente è utilizzabile. Il coraggio unito al pragmatismo.

Non posso però nascondere un po’ di sorpresa. Non dovremmo dire che COM è risorto, visto che non è mai stato dismesso, ma sicuramente da oggi inizia una seconda giovinezza, in cui dovremo scoprire se le rughe del passato hanno comunque lasciato qualche segno. Qualcosa è stato semplificato, qualcosa è rimasto. La gestione della memoria è ovviamente la cosa su cui ho maggiori preoccupazioni, per fortuna l’uso con C#/VB dovrebbe semplificare le cose a chi non può fare a meno di riferimenti circolari tra i suoi oggetti… Vi invito a leggere il post di Raffaele Rialdi con qualche dettaglio tecnico in più su questi aspetti.

Credo che le lenti migliori con cui dovremmo guardare a queste novità sono quelle che Miguel De Icaza descrive nel suo blog: WinRT è una nuova libreria per l’interfaccia utente. Non è la nuova API di Windows a 360 gradi. Nel bene, e nel male. Evidente che la cosa potrebbe cambiare nel futuro e un approccio analogo a WinRT potrebbe essere usato per altri servizi del sistema operativo, ma l’obiettivo di Microsoft, per Windows 8, è di fornire una nuova API che sia alla base di un ecosistema per lo sviluppo di applicazioni che copre un range ampio di sviluppatori: chi conosce .NET, chi conosce HTML/JavaScript e chi preferisce C++. Come sempre, l’architettura di un’applicazione complessa non dovrebbe dipendere dall’interfaccia. Da questo punto di vista, chi oggi scrive applicazioni nel modo corretto non si troverà di fronte a un problema insormontabile nel dover adattare il proprio codice alle nuove API. Quello che è relativamente nuovo, almeno per il mondo Windows, è che potrebbe avere senso avere due tipi di interfacce diverse per una stessa applicazione. Una per il “desktop”, completa di tutte le funzionalità. E una per i “device mobili”, in particolare per i tablet, con un’interfaccia utente magari semplificata e più adatta a un’interfaccia touch. Ma forse anche questo, in realtà, non è nuovo come concetto. Ciò che è nuovo è lo strumento con cui andremo a implementarlo.

Stiamo quindi preparando la DevCon Conference 2011, dove affronteremo tutte le questioni aperte, a cominciare da Silverlight e WPF che, parlando di interfaccia utente, sono i due strumenti più coinvolti nella discussione, anche se come abbiamo visto l’impatto è, da un punto di vista tecnico, più ampio e complesso. Merita perciò di essere conosciuto a fondo per prendere le migliori decisioni strategiche nei propri piani di sviluppo.

C# 4.0 verso i linguaggi dinamici

A PDC 2008 ci sono molti annunci, da Windows Azure a Oslo, di cui varrà la pena parlare in modo più approfondito dopo aver provato un po' le varie CTP rilasciate oggi.
Vale però la pena dare un'occhiata ad annunci che in questo momento possono sembrare minori ma che avranno un impatto (positivo) nei programmi "attuali". Uno di questo è C# 4.0, di cui da oggi è possibile conoscere funzionalità in dettaglio.
Personalmente sono colpito positivamente dalla keyword dynamic che, per il modo in cui è introdotta nella sintassi del linguaggio, non ha effetti collaterali particolari (almeno, per il momento non me ne vengono in mente). L'effetto pratico sarà una semplificazione della sintassi di C# necessaria a interoperare con classi COM, grazie anche agli argomenti opzionali e nominativi sulle chiamate a metodi.

A prima vista si può paragonare dynamic al VARIANT di VB. In realtà l'implementazione in .NET è fatta usando System.Object, con un attributo che ne definisce il tipo di utilizzo (dinamico, appunto). Il tutto fa uso del Dynamic Language Runtime e garantisce l'interoperabilità con altri linguaggi di scripting, compreso JavaScript (particolarmente importante nelle applicazioni Silverlight).