IL .NET FRAMEWORK

In questa sezione tratteremo un argomento di fondamentale importanza per tutte le applicazioni Visual Basic.net : il .NET FRAMEWORK.

Il Framework  e' una piattaforma di sviluppo grazie alla quale e' possibile sviluppare soluzioni desktop, client/server, internet/intranet,smart device(per dispositivi mobili come palmari)
Questo rende possibile per gli sviluppatori avere un ambiente unificato per sviluppare le loro soluzioni senza dover adottare diversi linguaggi e ambienti di sviluppo come invece era richiesto prima dell'avvento del .NET (ad esempio Visual Basic per applicativi desktop, client/server, C++ per le critical application, ASP per applicazioni web).
Sostanzialmente il .NET Framework e' composto principalmente da due blocchi distinti:

  • Common Language Runtime
  • Libreria di classi .NET

Il Common Language Runtime, noto come CLR, e' l'ambiente nel quale tutti gli applicativi .NET girano. Fornisce diversi servizi come la gestione dei thread e la gestione della memoria e del Garbage Collector (sistema che si occupa della cancellazione della memoria non piu` utilizzata) nonche` l'esecuzione del codice nativo generata dal compilatore  JIT (Just In Time) . Il JIT inoltre ha il compito di ottimizzare il codice in base alla macchina su cui gira, quindi non dobbiamo preoccuparci di utilizzare istruzioni particolari per sfruttare il Pentium4 piuttosto che l'Athlon, nel limite del possibile ci pensera` infatti il JIT.
Tecnicamente e' anche possibile precompilare il codice per evitare che venga utilizzato il JIT ad ogni esecuzione del programma, questo e` possibile grazie all'utility ngen.exe, disponibile nel framework, magari utilizzata in fase di installazione, per far si che l'applicazione venga ottimizzata per il sistema su cui gira, pero' questa pratica non e` molto consigliata in quanto si perdono diversi vantaggi.

La libreria di classi invece, e' un insieme di classi che si occupano delle piu` svariate funzionalita`sia di base che avanzate e che compongono il nucleo sul quale vengono poi sviluppate tutte le applicazioni .NET.
Queste classi, dato il numero imponente, sono organizzate in Namespace, una sorta di contenitori logici che ci aiutano a suddividere e ad individuare le classi in base al lavoro che svolgono. Tanto per fare un esempio se vogliamo utilizzare una classe che si occupa di Crittografia, la potremo sicuramente trovare nel namespace System.Security.Cryptografy.
Come si può notare, il namespace indicato e' composto da parole separate da punti, ogni parola rappresenta un Namespace dentro il quale possono esserci altri Namespace annidiati o classi. Infatti il Namespace Cryptografy che a noi interessa, e' contenuto nel Namespace Security che a sua volta e' contenuto nel Namespace System.
 Visual Studio .NET  grazie alla funzionalita' IntelliSense, simile a quella utilizzata in VB6, semplicemente scrivendo il nome di una classe o di un namespace, seguito dal punto, ci elenchera' i metodi (nel caso di classe) o i namespace e le classi (nel caso di Namespace) a disposizione.
Tutte queste classi sono contenute in assembly (una sorta di DLL) conservate nella GAC (Global Assembly Cache), una directory creata al momento dell'installazione del framework, che contiene, come il nome puo` suggerire, gli assembly utilizzati comunemente da tutti gli applicativi.
Oltre a questo Visual Studio .NET mette a disposizione anche un tool per il setup, tool tra l'altro necessario se si devono compiere modifiche nel registry, accedere a cartelle di sistema, registrare assembly nella GAC, etc... senza doversi fare da soli il programma di installazione.

Compilazione e Integrazione tra linguaggi

 

Un'altra cosa molto importante e` l'integrazione tra i vari linguaggi, infatti ora sara` possibile scrivere assembly con qualsiasi linguaggio Managed (gestito dal framework) che sara` poi possibile riutilizzare richiamando le classi con un'altro linguaggio, al giorno d'oggi esistono, oltre a VB.NET, C#, C++ Managed e J#, anche molti altri linguaggi dotati di compilatore che genera per l'appunto codice MSIL.
Per fare un esempio, possiamo crearci (o farci realizzare) le classi che compongono la parte di elaborazione in C# e salvarla in una libreria di classi (un assembly) e poi richiamare questo assembly in VB.NET con il quale possiamo poi realizzarne l'interfaccia grafica.
Questo e` dovuto  al fatto che ora il codice compilato non sara` piu` in codice nativo, ma sara` in
MSIL (Microsoft Intermediate Language), una sorta di linguaggio intermedio insomma.
Facendo un confronto con  Java, il concetto di MSIL e` paragonabile al ByteCode e il CLR e` paragonabile alla Java Virtual Machine.
Per far si che i vari linguaggi possano interagire correttamente, devono seguire uno standard per la definizione dei tipi, perche' un linguaggio potrebbe non conoscere un tipo di dato o potrebbe averlo di dimensioni diverse o memorizzati diversamente, basti pensare a come Visual Basic e C++ gestiscono diversamente le stringhe, si rende quindi necessario uno standard, ed e` per questo che esiste il
CTS (Common Type System) che permette appunto di avere delle regole da seguire nell'implementazioni dei linguaggi Managed e definisce un insieme di tipi comuni che i vari linguaggi devono utilizzare internamente (il programmatore potra` utilizzare i tipi di dati a lui famigliari, il compilatore dovrà  convertirli).
I programmatori affinché  possano sfruttare l'interoperabilita  dovranno seguire delle regole dettate dal
CLS (Common Language Specification)
.
 Ad esempio nel caso volessimo avere del codice CLS Compliant in C#, queste regole si possono riassumere cosi:

  • I tipi unsigned (senza segno) non dovrebbero far parte dell'interfaccia pubblica delle classi.
    In poche parole nessun metodo pubblico e nessuna proprieta` pubblica dovrebbero utilizzare, come parametri o valori di ritorno, dei tipi di dato unsigned. Nonostante questo possiamo utilizzarli a livello di scope della funzione oppure utilizzarli liberamente in proprieta` o metodi privati.
  • Tipi di dato Unsafe come i puntatori non dovrebbero essere utilizzati con i membri pubblici.
    Anche in questo caso si possono liberamente utilizzare nei membri privati.
  • I nomi delle classi, dei membri e delle proprieta' non dovrebbero differire solo in base al maiuscolo/minuscolo.
    Quindi non dovremmo dichiarare due metodi diversi come metodo1 e MeToDo1, questo perche` linguaggi come Visual Basic non sono case sensitive e quindi non riuscirebbero a risolvere il nome del metodo.
  • Solo proprieta' e metodi possono subire l'overloading, non gli operatori. Linguaggi come il C# permettono di fare l'overloading degli operatori ma altri come il Visual Basic non lo riescono a sfruttare, quindi per mantenere la compatibilita` con questi linguaggi, questa capacita` e` stata rimossa dalle specifiche CLS. Questo ovviamente riguarda le classi che esponete pubblicamente, se avete classi private potete fare quel che volete.