mercoledì 10 marzo 2010
Chi ha avuto modo di iniziare a utilizzare la Release Candidate di Visual Studio 2010, si sarà trovato di fronte quasi sicuramente a degli inspiegabili crash e successivi riavvii di Visual Studio stesso.
Purtroppo questo problema deriva da alcuni bug dell’IDE che reagisce male ad alcuni eventi di IntelliSense.
Per fortuna Microsoft ha rilasciato delle “patch” che possono essere installate per risolvere questo problema. Le trovate su “Connect”:
VS10-KB980610-x86.exe
VS10-KB980920-x86.exe
Inoltre, potete trovare al seguente indirizzo un post di Scott Guthrie che spiega il problema.
mercoledì 3 marzo 2010
Segnatevi questa data, organizzata in collaborazione tra Microsoft Italia e la Community DotNetWork.it:

A breve sarà pubblicata anche l’agenda delle sessioni, naturalmente su www.dotnetwork.it.
Vi annuncio che ci sarò anch’io, in qualità di speaker, con una sessione sulle novità del linguaggio Visual Basic 2010.
lunedì 1 marzo 2010
Assembly
Una tra le domande più frequenti dei nuovi programmatori in ambiente .NET è “Che cos’è un assembly?”.
Un assembly può essere visto da due punti di vista differenti, uno fisico e uno logico.
Dal punto di vista fisico, un assembly non è altro che un insieme di moduli eseguibili e non eseguibili (immagini, pagine HTML, file di risorsa ecc.).
Dal punto di vista logico, invece, un assembly è la più piccola unità riutilizzabile e distribuibile, con la stessa versione. Infatti le caratteristiche di un assembly sono principalmente:
- tutti i tipi e gli elementi dei moduli utilizzati insieme devono essere inseriti nell’assembly
- tutti gli elementi contenuti nell’assembly fanno parte della stessa versione
- definisce quali sono i tipi visibili all’esterno del modulo in cui sono definiti, ma che non sono visibili all’esterno (vedi modificatore di accesso Friend).
Ma alla fine, come è fatto un assembly? Esternamente vediamo che si tratta di un file eseguibile (EXE) oppure di una libreria (DLL). Non una libreria da registrare nel registro di sistema di Windows, però: con il Framework .NET non esiste più il cosiddetto “inferno delle DLL” (DLL hell), cioè il rischio di danneggiare una o più applicazioni, installando una nuova versione di una DLL, per esempio con un nuovo programma.
Ne riparleremo.
domenica 28 febbraio 2010
Il Framework .NET 4.0 RC (Release Candiate) richiede alcune caratteristiche ben precise che trovate a questo indirizzo: http://msdn.microsoft.com/en-us/library/8z6watww(VS.100).aspx
Intanto vediamo che ci vuole un processore di 1 Ghz, contrariamente alle versioni precedenti a cui “bastavano” 400 Mhz (1 Ghz era solo raccomandato, ora è il minimo).
Stesso discorso per la RAM: prima erano consigliati 256 MB (il minimo era 96 MB), ora il minimo è di 512 MB.
Non parliamo poi dello spazio su disco: rispetto alla la versione 3.5, la versione 4.0 richiede il triplo.
Per quanto riguarda il sistema operativo, a parte un paio di versioni particolari di Windows 7 non supportate, spariscono dal supporto alcuni sistemi operativi tra i più obsoleti: Windows 9x, Millennium, la versione 2000 Professional con SP4 e persino alcune particolari versioni di Windows XP. Non sono più supportate nemmeno le versioni di Windows NT e Windows 2000 Server.
Quindi attenzione: se avete computer un po’ datati, con sistemi operativi altrettanto datati, è opportuno verificare nella pagina che vi ho indicato se esiste ancora il supporto per il vostro sistema. Se siete sviluppatori, inoltre, sarà opportuno che teniate conto di queste tabelle di riferimento per informare i destinatari dei vostri software (utenti o clienti).
lunedì 22 febbraio 2010
Vi interessa trovare dei video didattici di qualità professionale sulle varie tecnologie di sviluppo Microsoft?
Volete trovare un video per la migrazione da VB6 a VB.NET?
Desiderate dei tutorial video o dei corsi approfonditi?
Provate a dare un’occhiata alla “Pluralsight On-Demand! .NET Training Library” (in lingua inglese):
http://www.pluralsight.com/main/olt/?ac=2108825486
Alcune risorse sono disponibili gratuitamente, mentre altre (decine e decine di video) sono disponibili solo previo pagamento di un abbonamento mensile o annuale (prezzo in Dollari).
Sul blog del Team di MSDN Italia è stato pubblicato un post per segnalare la disponibilità di una patch per Visual Studio 2010 Release Candidate per evitare i crash dovuti a problemi con l’IntelliSense.
Si trova qui: http://blogs.msdn.com/italy/archive/2010/02/16/patch-per-vs-2010-rc-crash-a-causa-di-problemi-con-l-intellisense.aspx
domenica 14 febbraio 2010
Per aprire un documento qualsiasi con l’applicazione predefinita, cioè quella associata alla specifica estensione del documento, si può procedere come nel seguente esempio:
Process.Start(My.Application.Info.DirectoryPath & _
"\Prova.docx")
Questa istruzione apre un documento di Word 2007, presente nella cartella dell’applicazione VB.NET. Se volete testare questa funzionalità, ricordatevi di copiare il file da aprire in entrambe le cartelle, Bin\Debug e Bin\Release.
L’istruzione di cui sopra non funziona se all’inizio del codice non avete inserito anche la seguente dichiarazione:
Imports System.Diagnostics
Se poi volete avere un maggiore controllo di quello che succede durante l’apertura del documento, potete utilizzare il seguente codice:
Dim p As New Process()
With p.StartInfo
.Arguments = My.Application.Info.DirectoryPath & _
"\Prova.pdf"
.UseShellExecute = True
.WindowStyle = ProcessWindowStyle.Minimized
.WorkingDirectory = _
"C:\Program Files (x86)\Adobe\Reader 9.0\Reader\"
.FileName = "AcroRd32.exe"
End With
p.Start()
p.Close()
p.Dispose()
In questo modo, potete, per esempio, aprire un documento con un’applicazione specificata oppure aprirlo con la finestra minimizzata nella barra delle applicazioni oppure addirittura nascosta.
Anche se è ancora in versione RC, ormai i giochi sono quasi fatti e si possono vedere un po’ di numeri sul contenuto del Framework .NET 4.0.
Per cominciare, il Team di sviluppo ha fatto un gran lavoro di “pulizia” e ha lavorato molto sull’ottimizzazione dei pacchetti di installazione e sulla compressione. I risultati sono i seguenti:
- il pacchetto di installazione del Framework .NET “full”, sia per x64 sia per x86, “pesa” ora solamente 54 Mb contro i circa 250 della versione 3.5 SP1
- il pacchetto della sola versione x86 si è ridotto a circa 36 Mb
- la versione “client profile” ora “pesa” ancora meno: solo circa 30 Mb.
(Fonte: una discussione tra Corrado Cavalli, Scott Guthrie in persona e altri http://groups.google.com/group/wpf-disciples/browse_thread/thread/12c6e01aa83987ec/6a2cc9dc195bd2ac?lnk=raot&pli=1)
Se volete analizzare le varie versioni del Framework .NET o addirittura confrontarle tra loro, potete utilizzare una utility di nome NDepend (http://www.ndepend.com/). Ecco qui un paio di articoli sull’uso di questo software:
http://codebetter.com/blogs/patricksmacchia/archive/2009/06/01/analyze-and-explore-the-evolution-of-net-framework-by-yourself.aspx
http://codebetter.com/blogs/patricksmacchia/archive/2009/08/04/reporting-code-diff.aspx
Interessante il fatto che NDepend permette di interrogare i Framework .NET con una sintassi SQL-like. Per esempio:
- Quali metodi pubblici hanno più di 30 linee di codice?
SELECT METHODS WHERE NbLinesOfCode > 30 AND IsPublic
- Quali classi implementano System.IDisposable?
SELECT TYPES WHERE IsClass AND Implements "System.IDisposable"
- Quali metodi hanno subito un refactoring recentemente e non sono completamente coperti dal test?
SELECT METHODS WHERE CodeWasChanged AND PercentageCoverage < 100
I risultati dei test, precedenti al Framework .NET 4.0, sono pubblicati in questa pagina:
http://blogs.msdn.com/brada/archive/2008/03/17/number-of-types-in-the-net-framework.aspx
L’analisi del Framework .NET 4.0 Beta 1 è pubblicata in questa pagina:
http://codebetter.com/blogs/patricksmacchia/archive/2009/05/21/a-quick-analyze-of-the-net-fx-v4-0-beta1.aspx
mentre le differenze tra la Beta 1 e la Beta 2 dello stesso Framework .NET sono qui:
http://codebetter.com/blogs/patricksmacchia/archive/2009/10/21/interesting-findings-in-the-diff-between-net-fx-v4-beta1-and-beta2.aspx
Un lavoro niente male, no?
Molti utilizzatori di Visual Studio 2008 chiedono, su vari forum e newsgroup, qual è la combinazione di tasti “per fare questo e per fare quello”.
Se anche voi avete il desiderio di imparare qualche scorciatoia di tastiera, dato che con la tastiera “si fa prima”, invece di farsi venire la sindrome del tunnel carpale agitando continuamente il mouse, potete scaricare questi due PDF:
Visual Basic 2008 Keybinding Reference Poster
http://www.microsoft.com/downloads/details.aspx?familyid=255B8CF1-F6BD-4B55-BB42-DD1A69315833&displaylang=en
Visual C# 2008 Keybinding Reference Poster
http://www.microsoft.com/downloads/details.aspx?FamilyID=e5f902a8-5bb5-4cc6-907e-472809749973&displaylang=en
Sono dei poster in inglese per VB 2008 e per C# 2008 che potete stampare (sia a colori che in tonalità di grigio) e affiggere vicino al computer, così non vi perdete nemmeno una scorciatoia di tastiera! Comodo, no?
Se avete la necessità di verificare lo stato della coda di stampa predefinita, potete utilizzare il namespace System.Printing che trovate però solo dal Framework .NET 3.0 in poi.
Per prima cosa dovete aggiungere un riferimento a System.Printing nella scheda Riferimenti delle proprietà del progetto.
Una volta aggiunto il riferimento, utilizzate un codice simile a questo:
Imports System.Printing
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim ps As New LocalPrintServer()
Dim pq As PrintQueue = ps.DefaultPrintQueue
Dim err As Boolean = pq.IsInError
If err = True Then
MessageBox.Show("Errore di stampante")
Else
MessageBox.Show("Nessun errore di stampante")
End If
End Sub
End Class
Da qualche tempo è nata la nuova piattaforma per i forum Microsoft e una parte di questa è preposta ad ospitare alcuni forum di Microsoft Italia.
L’indirizzo dei forum italiani è il seguente: http://social.microsoft.com/Forums/it-IT/categories
Da oggi, poi, sono stati creati anche alcuni forum dedicati agli sviluppatori, per le seguenti tecnologie/linguaggi:
- ASP.NET
- Silverlight
- Visual C#
- Visual C++
- Visual Basic (creato su mia proposta)
Microsoft sta puntando molto su questi forum, con la probabile intenzione di far perdere gradualmente interesse nei confronti dei newsgroup.
Quindi … “social-forum-izziamoci” 
(P.S. io e Alessandro Del Sole siamo i moderatori del forum dedicato a VB)
Spesso ci capita di conoscere varie tecniche per risolvere un nostro problema applicativo e/o di programmazione e non sappiamo quali di queste tecniche è più efficace dal punto di vista delle prestazioni, cioè quale impiega meno tempo a terminare l’esecuzione.
Le prestazioni di diversi algoritmi, talvolta, hanno una piccola differenza di tempo nell’esecuzione di singoli passi di programma, ma se moltiplichiamo la differenza di tempo per centinaia di migliaia di elementi da elaborare, il tempo totale diventa percepibile in modo pesante dall’utente. E’ quindi necessario sperimentare i vari algoritmi o frammenti di codice per verificare quale sia preferibile tra le varie possibilità.
Un modo semplice è quello di utilizzare un oggetto di classe TimeSpan, rilevando i “ticks” all’inizio del frammento di codice e alla fine del frammento, calcolando poi la differenza tra le due registrazioni.
I “tick” sono le più piccole unità di tempo in .NET, equivalenti a 100 nanosecondi.
Per esempio:
' ...
' prima registrazione
Dim ts1 As New TimeSpan(Now.Ticks)
' frammento di codice o ciclo da valutare
' ...
' registrazione finale e visualizzazione della differenza di tempo
Dim ts2 As New TimeSpan(Now.Ticks)
MessageBox.Show((ts2 - ts1).ToString)
' ...
Un metodo alternativo e anche più appropriato è il seguente
Dim ts1 As long = Environment.TickCount
…
MessageBox.Show((Environment.TickCount – ts1).ToString)
E’ una versione più appropriata, in quanto utilizza Environment che fa parte del Framework .NET, al posto della funzione Now che deriva dal vecchio VB6.
In questo modo sarà possibile esaminare i tempi di diversi algoritmi ed effettuare così la scelta del migliore, nel caso preso in esame.
Attenzione: non è un metodo che permette di effettuare dei veri e propri benchmark, perché i tempi di esecuzione spesso dipendono da molti altri fattori. Per esempio servizi e programmi attivi, disponibilità di RAM nel momento dell’esecuzione, carico del processore e così via. In ogni caso, il metodo proposto è un metodo empirico sufficientemente significativo e soprattutto semplice per fare delle valutazioni “a spanne” ma con dei dati alla mano. Per un migliore risultato e una maggiore sicurezza delle misurazioni è consigliabile ripetere la misurazione più volte.
Mi è stato fatto rilevare che con VB.NET è possibile dichiarare un array utilizzando una sintassi che prevede l’uso di un parametro, anziché un valore costante.
Nel mio libro su VB 2008, per esempio, in tutti gli esempi ho sempre utilizzato la forma:
Dim x(10) As Integer
ma con VB 2008 (e precedenti VB .NET) è possibile farlo anche con la seguente sintassi:
Dim numero As Integer = 10
Dim x(numero) As Integer
Ecco quindi che possiamo creare anche un array con dimensione variabile, utilizzando un valore random:
' prendiamo il numero di secondi dall’ora attuale
Dim seme As Integer = Now.Second
' creiamo un oggetto di tipo Random, utilizzando
' come seme il numero di secondi
Dim x As New Random(seme)
' definiamo il limite superiore dell’array
Dim limite As Integer = x.NextDouble * 100
' dichiariamo l’array con il parametro indicato
Dim arr0(limite) As String
' inseriamo in ciascun elemento il valore
' del suo indice
For i As Integer = 0 To arr0.GetUpperBound(0)
arr0(i) = i
Next
' visualizziamo il valore dell’ultimo elemento
MessageBox.Show(arr0.GetUpperBound(0))
Come già preannunciato da tempo, il nuovo libro dedicato a “SQL Server 2008 – Guida all’uso” è uscito il 31 Agosto 2009.
Nel frattempo, visto comunque che la mia principale “vocazione” è per Visual Basic, vi anticipo che l’undicesimo capitolo è interamente dedicato a Visual Basic 2008 alle modalità di accesso a un database di SQL Server 2008 e alle modalità di visualizzazione e aggiornamento dei dati: con i wizard e con comandi diretti, utilizzando un controllo DataGridView o controlli Windows Form, in data binding. Inoltre, nel decimo capitolo ci sono anche due esempi di creazione di stored procedure da Visual Studio 2008, in linguaggio VB.
Ho quindi il piacere di pubblicare gli esempi VB che potete scaricare liberamente e gratuitamente da questo link.
Sono certo che non ci saranno obiezioni da parte dell’editore anche nell’anticipazione del Capitolo 11 in PDF.
Questi esempi dovrebbero quanto meno soddisfare le necessità di chi ha difficoltà a “ingranare” con ADO.NET 2.0 per creare applicazioni in grado di leggere e modificare dati memorizzati in database di SQL Server 2008.
Per chi dovesse avere la necessità di inserire un file in un campo BLOB o, viceversa, estrarre un file da un campo BLOB utilizzando VB.NET e ADO.NET, con i provider OleDb e SqlClient, potrà farlo seguendo le indicazioni di questo articolo:
http://support.microsoft.com/kb/316887
L’articolo è un po’ vecchiotto (2004) ma sempre utile.
Personalmente, però, preferisco sempre la scelta di mantenere i file nel filesystem e di inserire nel database il solo riferimento alla posizione nel filesystem.