Il .Net Compact Framework è l’ambiente integrato in Windows Mobile che consente l’esecuzione di applicazioni gestite, sviluppate in linguaggi di programmazione quali il VB.net e il C#. Il .Net Compact Framework (da ora in poi netCF), può essere considerato come una versione “snellita” del .Net Framework, ma al tempo stesso include namespace che non sono presenti nel fratello maggiore. Appare quindi evidente che il netCF è stato privato di classi che non avrebbero senso in applicazioni per sistemi come Windows Mobile, ma d’altro canto, è stato munito di classi per la gestione di eventi collegati alla telefonia, oppure di eventi connessi all’ottimizzazione di applicazioni a causa dell’hardware [limitato] di cui un dispositivo mobile è munito.
Una cosa importante da capire è che il netCF non è nato a partire dal .Net Framework, ma, anche se ne condivide l’architettura di base, è stato riscritto da zero al fine di includere solo il necessario per ottimizzare la gestione dei dispositivi mobili.
Architettura del .Net Compact Framework
L’architettura del netCF può essere riepilogata tramite la seguente figura:
Framework Class Library
E’ l’insieme delle classi, interfacce e tipi organizzati in namespace. Ha meno classi del fratello maggiore, ma a differenza di quest’ultimo include determinate classi per la gestione di determinate operazioni su i dispositivi mobili. La cosa interessante è che una discreta conoscenza del .Net Framework, facilita la comprensione del netCF. Nell’immagine seguente sono illustrate le classi presenti nel netCF in relazione a quelle presenti nel .Net Framework:

[Fonte: http://download.microsoft.com/download/9/B/6/9B64192D-7381-451E-8692-B6B450643412/poster_updated.pdf]
Common Language Runtime
Il CLR del netCF è stato ri-creato in base alle funzionalità del CLR per il .Net Framework. E’ possibile sviluppare le proprie applicazioni in VB.Net o C#, e il risultato è come sempre in MSIL, il linguaggio intermedio che verrà poi compilato runtime tramite il JIT (e quindi convertito in linguaggio macchina). Il CLR pone particolare attenzione alla memoria: infatti, poiché quasi sempre gira su dispositivi che hanno una limitata quantità di memoria, si occupa di gestire in modo efficiente, la quantità di memoria messa a disposizione.
Windows CE
Oltre al codice gestito, il netCF consente di sviluppare applicazioni in codice nativo. In realtà il netCF non sviluppa direttamente codice nativo, ma usa le dll native di Windows CE per raggiungere l’obiettivo. Tale modalità viene anche definita con il nome di Platform Invoke. Una caratteristica delle P/Invoke è che consentono di accedere ad oggetti COM tramite un’applicazione managed. In pratica il netCF non consente l’interazione diretta con gli oggetti COM, ma il workaround consiste nel richiamare tramite le P/Invoke una DLL wrapper dell’oggetto COM a cui bisogna accedere. Inoltre viene effettuato un marshalling dei tipi di dati tra il CLR e l’ambiente nativo. Le P/Invoke sono fornite tramite il namespace System.Runtime.InteropServices.
La Gestione della memoria nel .Net Compact Framework
Come già detto, il netCF ha una ottimale gestione della memoria, consentendo di far girare applicazioni in modo accettabile anche su dispositivi con limitata quantità di memoria (naturalmente sempre se l’applicazione richiede una quantità di memoria minore di quella disponibile!). Infatti, quando non è disponibile memoria sufficiente, in .NET Compact Framework vengono automaticamente rilasciate le strutture di dati interne non richieste dal codice attualmente in esecuzione. Inoltre, durante l’esecuzione di una applicazione non viene effettuato alcun accesso alle memoria ram. Dal punto di vista della protezione, invece, in caso di accesso alla memoria senza proprietario vengono sempre generate eccezioni.
In aggiunta a questo, come l’MSDN riporta:
“Mediante l'host del dominio applicazione vengono avviati le applicazioni .NET Compact Framework e Common Language Runtime. Le applicazioni .NET Compact Framework utilizzano lo spazio del codice e lo spazio dei dati statici e dinamici come le applicazioni native. Quando non sono in esecuzione applicazioni .NET Compact Framework, la RAM viene utilizzata solo per l'host del dominio applicazione, mentre una quantità ridotta di dati statici viene utilizzata da Common Language Runtime. In Windows CE .NET viene creato un host del dominio applicazione all'avvio di un'applicazione .NET Compact Framework.
Le applicazioni .NET Compact Framework vengono assemblate in file EXE e DLL, che possono essere memorizzati in un file system in sola lettura o in lettura/scrittura nella memoria flash oppure in sola lettura nella ROM. Questi file possono essere letti dal caricatore di classe di Common Language Runtime in blocchi indirizzabili direttamente, senza la creazione di una copia in memoria e senza che sia richiesta un'unità di gestione della memoria per creare una visualizzazione mappata in memoria del file.”
La memoria RAM e la memoria ROM vengono usate in questo modo:
- RAM: viene in genere usata per la memorizzazione di strutture dati dinamiche e codice compilato tramite JIT. Il netCF usa una quantità prestabilita di RAM, che è pronto a liberare nel momento opportuno. Il CLR inoltre usa tecniche di code-pitching, liberando così spazi di memoria.
- ROM: viene in genere usata per la memorizzazione del codice nativo di cui è costituito il CLR, ed in alcuni casi anche i file contenenti metadati e istruzioni MSIL (Microsoft Intermediate Language) per librerie di classi.
Tipi di dati
Come nel .Net Framework, anche nel netCF esistono 2 tipi di dati: per valore e per riferimento. Il primo serve per memorizzare solo valori, il secondo invece consente la memorizzazione di oggetti. La principale differenza tra i due è dove vengono memorizzati. I tipi di valore vengono allocati nello stack, i tipi di riferimento invece usano l’heap e per tale motivo necessitano di un garbage collector, al fine di liberare la memoria occupata e non più utile ai fini della corretta esecuzione di un’applicazione.
Bisogna aggiungere che il netCF supporta l’ereditarietà singola, la Reflection, e le Generics. Inoltre anche nel netCF il programmatore può far uso dei blocchi di codice try/catch/finally al fine di gestire eccezioni runtime.
Installazione del .Net Compact Framework
In genere il .Net Compact Framework viene installato insieme al Visual Studio. C’è da notare che non tutte le versioni di Visual Studio supportano la creazione di applicazioni per smart device: solo le versioni Standard e superiori di Visual Studio, hanno la possibilità di creare questo tipo di progetto. E’ necessario installare anche il Windows Mobile SDK, che include molti esempi di codice e gli indispensabili emulatori (nel prossimo articolo ne parleremo in dettaglio) per testare a fondo le nostre applicazioni.
Stato dell’arte
Attualmente il netCF si trova alla versione 3.5. Ecco alcune novità rispetto alle versioni precedenti sono le seguenti:
- netCF 3.5 supporta Windows Communication Foundation;
- netCF 3.5 consente di effettuare query su database, xml e oggetti in memoria tramite LINQ;
- miglioramento delle windows form;
- introduzione di SoundPlayer, che consente la riproduzione di più suoni;
- supporto per la compressione tramite il namespace System.IO.Compression;
- è stato aggiunto il profiler CLR, che consente di visualizzare l'heap gestito di un processo ed esaminare il comportamento del Garbage Collector;
Epilogo
Oggi giorno l’uso dei dispositivi mobili risulta sempre più diffuso. Basti pensare che sistemi operativi come Windows Mobile consentono di portarsi un vero e proprio ufficio in tasca, che di gran lunga facilitano il lavoro delle persone. Ma non solo. Il target non si limita ai soli lavoratori! Anche un adolescente,può farne uso per ascoltarne musica, consultare pagine web, controllare la posta. Insomma, appare evidente che i dispositivi mobili si prestano ad una marea di usi, indipendentemente da chi li usa.
In questa primo articolo, abbiamo dato un’occhiata al cuore che consente di far “pulsare” le nostre applicazioni su Windows Mobile. La conoscenza del netCF risulta necessaria per capire innanzitutto come dover sviluppare le nostre applicazioni, ma anche come ottenerne il meglio sfruttando appieno ciò che il netCF ci mette a disposizione.
Per il momento non mi resta che salutarvi e darvi appuntamento al prossimo articolo.
Stay tuned :)
[Bibliografia]
- Sezione relativa al .Net Compact Framework su MSDN;
- Professional Microsoft Smartphone Programming (Yang, Zheng, Ni) - Wiley 2007