AntonioPelleriti.it [aka z9]

I code, therefore I am

NAVIGATION - SEARCH

Articolo su IoProgrammo 208: Microsoft Graph API

Su IoProgrammo numero 208(Novembre2016), trovate un mio articolo dedicato alle API di Microsoft Graph, con un esempio per inviare mail tramite i servizi di Outlook.

 Titolo di copertina:

Programmiamo Office 365 sul Cloud, Impariamo a utilizzare le Microsoft Graph API per interagire con la suite Office e automatizzare qualsiasi operazione 

Articolo IoProgrammo 204: Microsoft Bot Framework.NET

Su IoProgrammo numero 204(Luglio 2016), trovate un mio articolo dedicato al Microsoft Bot Framework, con un esempio per  creare un bot per Skype

 Titolo di copertina:

L'interfaccia della tua app è una voce su skype, Impara a utilizzare il Microsoft Bot Framework, semplice ed innovativo





Espressioni Lambda e ricorsione

Una espressione lambda può essere ricorsiva. Quindi è possibile invocare la stessa funzione, assegnando l'espressione lambda ad una variabile, e naturalmente assicurandosi che ci sia sempre una condizione di uscita, per evitare che la ricorsione sia infinita.

Ecco un esempio che calcola il classico fattoriale di un numero.

Il fattoriale di un numero n è il prodotto dei numeri positivi minori o uguali a n. Per definizione, se n è = 0 il fattoriale di n è 1.

Per esempio il fattoriale di 5 è uguale a 5*4*3*2*1 = 120.

Ed ecco l'implementazione mediante una espressione lambda.

Func<int,int> fattoriale = null;
fattoriale = (n) => n==0 ? 1: n*fattoriale(n - 1);		

int result=fattoriale(5);	
Console.WriteLine(result);

L'espressione lambda è assegnata alla variabile fattoriale, ed al suo interno invoca se stessa.





Articolo IoProgrammo 203: le .NET Scripting API di Roslyn

Su IoProgrammo numero 203(Maggio/Giugno 2016), trovate un mio articolo dedicato a Roslyn ed in particolare alle Scripting API, con un esempio per  creare un piccolo esempio di REPL (Read Eval Print Loop)

Titolo di copertina:

  • SISTEMA
  • Metti un compilatore nella tua app
  • Scopriamo l'incredibile potenza delle Scripting API di .NET

 

 

 

Programmare con C# 6: in arrivo

Finita la seconda rilettura delle bozze, iniziatala la fase di impaginazione e di impostazione grafica, non manca molto all'uscita in libreria di

Programmare con C# 6, guida completa

Non ho ancora una data di uscita certa, o altri dettagli, come il numero di pagine definitivo, o se qualche capitolo verrà escluso (e magari rilasciato su questo sito in pdf!).

Il libro copretutte le novità introdotte da C# 6, in modo completo ed in modo da rendere il testo il riferimento principale in lingua italiana sul linguaggio C#: l'obiettivo, come per la prima edizione, è stato quello di scrivere il miglior libro italiano su C# 6 (scusate la presuzione!).

Nell'attesa di aggiornarvi con maggiori dettagli di seguito l'elenco degli argomenti che è quasi definitivo.

  • 1. C# e la piattaforma .NET
  • 2. Concetti di base di C#
  • 3 Tipi e oggetti
  • 4 Espressioni e operatori
  • 5 Controllo di flusso
  • 6 Programmazione a oggetti in C#
  • 7 Ereditarietà e polimorfismo
  • 8 Gestione delle eccezioni
  • 9 Tipi generici e collezioni
  • 10 Delegate ed eventi
  • 11 LINQ
  • 12 Multithreading, Programmazione asincrona e parallela
  • 13 XML in C#
  • 14 Reflection, attributi e programmazione dinamica
  • 15 Accesso ai dati
  • 16 .NET Compiler Platform
  • 17 Applicazioni pratiche di C#
  • App. A Stringhe ed espressioni regolari
  • App. B Interoperabilità
  • App. C Risposte alle domande

Noterete la presenza di un nuovo capitolo, il 16, dedicato interamente ad una delle principali nuove funzionalità o caratteristiche di .NET e C# 6: cioè la .NET Compiler Platform, ed inoltre una appendice con le risposte alle domande poste alla fine di ogni capitolo.

 

Articolo IoProgrammo 201: Un QR Code Reader con Xamarin Forms

Su IoProgrammo numero 201(Gennaio/Febbraio 2016), trovate un mio articolo dedicato a Xamarin Forms, con un esempio per creare una app mobile Android, iOS, Windows Phone, che implementa un QR Code Reader.

Titolo di copertina:

  • QRCODE IN 10 RIGHE C#
    Tutto il codice necessario pronto per essere integrato nel tuo programma

 

 

 

 



Inglobare tutte le dll in un singolo exe e utilizzarle con la Reflection

La stragrande maggioranza delle applicazioni usa delle dll esterne, eventualmente di terze parti.

Quando l'applicazione deve essere distribuita anche gli assembly da cui dipende, cioè tutti i riferimenti esterni devono essere distribuiti assieme all'eseguibile. In generale lo si fa con la classica tecnica Xcopy, prendendo tutto quello che c'è nella cartella Bin/Release prodotta da Visual Studio per esempio, oppure creando un setup ad hoc che si occupi di tutto.

Un'altra possibile tecnica è quella di inglobare tutte le dll all'interno dell'eseguibile e quindi con la comodità di distribuire un solo file.

Supponiamo di avere una semplice applicazione Windows Forms, che utilizza una dll per esempio chiamata MyAssembly.dll.

Al progetto Windows Forms, che avrà un riferimento alla libreria, bisogna apportare una prima modifica, aggiungendo il file MyAssembly.dll come un normale file (click con il destro, Add Existing Item e selezione della dll) e quindi, fra le proprietà del file aggiunto, impostando il valore della proprietà Build Action a Embedded Resource.

A questo punto compilando l'applicazione, l'eseguibile prodotto conterrà la dll come risorsa inglobata. Potete verificarlo con un decompilatore come Reflector o JustDecompile.

 

 

Adesso bisogna fare in modo che a runtime l'applicazione sia in grado di recuperare la dll dalle risorse embedded.

Nel metodo Main dell'applicazione aggiungiamo un gestore dell'evento AssemblyResolve dell'AppDomain corrente:

 static void Main()
 {
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
...

 

Il gestore dell'evento, si occupa di ricercare fra le risorse embedded l'assembly (l'evento si scatena al primo utilizzo dell'assembly riferito) e di restituirlo leggendone il contenuto e caricandolo con il metodo Assembly.Load:

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string dllName = new AssemblyName(args.Name).Name + ".dll";

            var asm = Assembly.GetExecutingAssembly();
            String resourceName = asm.GetManifestResourceNames().FirstOrDefault(rn => rn.EndsWith(dllName));
            if (resourceName == null) return null; // Non trovata

            using (var stream = asm.GetManifestResourceStream(resourceName))
            {
                Byte[] assemblyData = new Byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }

 

 


 

Una recensione di NDepend

Qualche giorno fa ero alle prese con l'ottimizzazione di una grossa soluzione di Visual Studio, composta da decine di progetti fra cui un paio scritti in vb.net. La mia intenzione, essendo molto più ferrato in C# era di convertire questi scritti in VB.net, ma dovevo conoscere la struttura dell'intera soluzione ed in particolare le dipendenze fra i vari progetti. Le altre ottimizzazioni sarebbero venute dopo, in C#, cosa per me molto più facile!

Alla ricerca di uno strumento che mi consentisse di ricavare e rappresentare magari graficamente una matrice di dipendenza, sono capitato sul sito di NDepend.

In particolare ciò che mi ha attirato e convinto a provarlo è stata la possibilità di creare una Dependency Structure Matrix (http://www.ndepend.com/docs/dependency-structure-matrix-dsm), sia in forma grafica che in formato tabellare.

NDepend è uno strumento potentissimo, potete visionare le varie altre feature qui: http://www.ndepend.com/features/

Download e Installazione

E' possibile ottenre una versione di prova della durata di 14 giorni scaricandola dal link http://www.ndepend.com/download.

La procedura di installazione è molto semplice, non c'è! NDepend viene fornito sotto forma di un file zip, basta decomprimerlo in una cartella a vostra scelta, magari non in '%ProgramFiles%\NDepend' per evitare problemi di permessi, e poi sarà possibile eseguirlo sia in versione standalone (VisualNDepend.exe), oppure lanciare l'installer dell'estensione di Visual Studio (NDepend.VisualStudioExtension.Installer.exe).

Patrick Smacchia, creatore di NDepend, è stato inoltre così gentile da fornirmi una licenza MVP per provare a fondo lo strumento (ma questo non influirà sulla mia rcensione!). In tal caso è stato sufficiente copiare il file di licenza (nel mio caso NDependProLicense.xml) all'interno della stessa cartella in cui avete decompresso il file zip.

Utilizzo di NDepend

Per eseguire NDepend in modalità stand alone basta lanciare VisualNDepend.exe, e si aprirà la finestra seguente (l'immagine è della versione 6.0.1 Professional).

 

Possiamo ora scegliere cosa analizzare, partendo per esempio da una soluzione Visual Studio che da un set di assembly già compilati. Sulla sinistra trovate i link rapidi per avviare le varie possibilità. L'analisi si basa comunque sempre su un set di assembly, quindi anche se si seleziona una soluzione di Visual Studio, NDepend va alla ricerca degli assembly prodotti dalla compilazione.

Notare che è possibile installare, se già non lo si è fatto, l'estensione per Visual Studio, in maniera da poter sfruttare tutte le funzionalità di NDEpend direttamente all'interno dell'IDE Microsoft.

Per mostrare come funziona NDepend, ho scelto di analizzare la soluzione fornita da Telerik per gli esempi di utilizzo dei propri controlli WPF.

Quindi, dopo aver compilato tale soluzione, ho scelto il comando Analyze VS Solutions and VS Projects, che fra l'altro è evidenziato da una freccia lampeggiante, e selezionato nella schermata seguente, gli assemblies da analizzare:

 

Confermando l'avvio dell'analisi, alla fine della stessa otterremo una conferma del completamento e si potrà decidere come proseguire.

L'analisi è molto veloce, nel mio caso ho selezionato 77 assemblies, ed è stata terminata in 1 minuto e 4 secondi. Terminata questa fase, apparirà la seguente schermata di conferma e se avete lasciato il check selezionato su Build Report di aprirà anche una pagina web con un report di riepilogo.

Analisi dei risultati

La cosa più semplice da fare, soprattutto le prime volte, per prendere familiarità con i vari strumenti, e cliccare su View NDepend Dashboard, che che aprirà la sezione Dashboard con un riepilogo dell'analisi effettuata.

Sulla sinistra avrete a disposizione un browser delle classi analizzate, simile a quello di Visual Studio, mentre al centro della schermata potete già dare un'occhiata panoramica a quello che costituisce la soluzione. Per esempio linee totali di codice, numero di tipi, percentuali di commenti, complessità media, e sulla destra anche il risultato dell'analisi rispetto a delle regole standard. Da cui è facilissimo navigare nelle altre sezioni.

Intanto oltre alla Dashboard, è possibile passare rapidamente alle altre sezioni:Dependency Graph, Dependency Matrix, Metrics e così via.

Mentre cliccando sui link, per esempio quello che indica il numero di 10 regole critiche violate, verrà aggiornato il Query Explorer in basso, che mostra intanto le varie categorie di regole:

 

Facendo click su ogni query, verrà eseguita la query CQLinq stessa (vedi paragrafo seguente) che mostrerà i risultati nel pannello a sinistra.

Per esempio fra i miei risultati, mi viene indicato che 2 metodi hanno troppi parametri, se voglio conoscere quali sono esattamente, magari per poterli semplificare, l'esecuzione della query mi mostrerà il seguente risultato:

 

 

quindi otteniamo sia il nome del metodo incriminato, e il numero dei suoi parametri.

Ogni regola funziona così, c'è una corrispondente query, e cliccandoci viene eseguita e ne vediamo subito i risultati. Ad un primo impatto l'interfaccia è forse un pò complessa da digerire, con un sacco di tooltip, e possibilità di navigazione. Ma una volta capito il meccanismo è semplice orientarsi.

Dependency Graph e Matrix

La sezione che più mi interessava per il mio progetto lavorativo, era quella relativa alle dipendenze. Volevo ottenere le dipendenze fra i vari assembly del progetto ma anche fra i vari tipi. NDepend consente di ottenere tali dipendenze sia in maniera grafica che mediante una matrice.

La prima possibilità è veloce da capire ma in caso di progetti complessi è spesso incomprensibile! Date un'occhiata all'intero grafico ottenuto con l'esempio:

 

Naturalmente è possibile filtrare i nodi visualizzati, per esempio escludendo gli assembly di terze parti, o navigando verso grafi di dipendenza più semplici, con un click con il destro che mostra un menù con decine di possibilità.

Per un'analisi più puntuale e magari per esportare i risultati, potete passare alla visualizzazione a matrice, che mostra i nodi su righe e colonne e nelle varie intersezioni consente di leggere quali sono gli eventuali livelli di dipendenza. Qui è comodissimo il tooltip che appare posizionandosi su ogni quadratino colorato, nel quale viene spiegato qual'è il nodo sulla riga e quello sulla colonna e perchè sono dipendenti.

Nella stessa matrice è possibile ottenere informazioni su cicli di dipendenza, evidenziati con un bordo rosso e dei quadrati neri. Anche in questo caso con un click con il tasto destro è possibile passare a dettagli maggiori, mentre con la barra degli strumenti in alto è possibile filtrare e configurare quali informazioni sono quelle che ci interessano maggiormente. 

 

 

CQLinq

Fra le funzioni più potenti, vi è la possibilità di scrivere e personalizzare delle query LINQ per analizzare il contenuto degli assembly, mediante un apposito provider detto CQLinq, ovvero Code Query over Linq. NDepend ne fornisce già circa 200 pronte all'uso e utilizzate internamente per le analisi standard. Ma siete liberi di scriverne anche di personalizzate, il tutto con l'ausilio di intellisense e compilazione automatica.

Per esempio la seguente query consente di ottenere l'elenco dei metodi che hanno più di 200 linee di codice:

 

A questo punto solo la vostra fantasia può porre limiti alle analisi che potete eseguire sul vostro codice!

Documentazione

Sul sito ufficiale NDepend trovate una sezione di documentazione, molto completa, con video, tutorial, ed approfondimenti sulle varie feature. In particolare vi consiglio di dare un'occhiata al video Getting Started per capire come installare e cominciare a prendere confidenza con le potenzialità dello strumento.

Prezzi

Dopo la trial di 14 giorni, per continuare ad usare NDepend (non ne potete probabilmente fare più a meno) dovete acquistare una licenza. I prezzi sono senz'altro accessibili, a mio parere. date un'occhiate al listino, ma 299€ per una licenza 1 seat è un costo equo, a mio parere.

Considerazioni finali

NDepend è un tool potentissimo, molto stabile e veloce. La curva di apprendimento può essere un pò ripida, ma dopo che aver preso padronanza dei vari strumenti messi a disposizione, in particolare della possibilità di scrivere le proprie query, potete analizzare le vostre applicazioni (o quelle di terze parti) in ogni loro dettaglio ed ascoltando i suggerimenti basate sulle regole standard migliorerete moltissimo la loro qualità.

Mi sento assolutamente di consigliarlo ad ogni sviluppatore .NET, ed in particolare a chi magari deve mettere le mani ad un progetto complesso ed iniziare a conoscerlo nel più breve tempo, e per chi, sempre alle prese con progetti di una certa dimensione, ha il compito di ottimizzarlo.

 

Articolo IoProgrammo: Roslyn, il nuovo compilatore di Microsoft

Su IoProgrammo numero 197 (Maggio /Giugno 2015), trovate un mio articolo dedicato alle novità del nuovo compilatore di Microsoft, denominato Roslyn, utilizzato da Visual Studio 2015, che è open source ed è integrabile nelle vostre applicazioni.

Titolo di copertina:

  • Roslyn: Microsoft abbraccia l'Open Source
    Scopri cosa cambia con il nuovo compilatore di Visual Studio 2015

 

 

 



Articolo IoProgrammo: Alla scoperta di C# 6

Su IoProgrammo numero 196 (Marzo/Aprile 2015), trovate un mio articolo dedicato alle novità della prossima versione di C# 6, che vedrà la luce con Visual Studio 2015.

Titolo di copertina:

TUTTE LE NOVITÀ DI C# 6
Scopriamo in dettaglio i vantaggi della nuova versione di C#
Già disponibile in Visual Studio 2015!