Category Archive for .net

Creiamo un servizio Windows in VB.NET

Che cos’è un servizio Windows? Sui sistemi operativi Microsoft, un servizio Windows è un eseguibile che compie determinate funzioni e che è progettato per non richiedere intervento da parte dell’utente. Possono essere configurati per essere avviati in fase di boot e per essere eseguiti in background. In alternativa, si possono far partire manualmente, se lo si desidera. Da un punto di vista concettuale, sono analoghi ai demoni Unix.

Fatta questa premessa, rispondiamo ora alla domanda principale: come possiamo creare un nuovo Windows service in ambiente .NET? Per cominciare, creiamo in Visual Studio un nuovo progetto di tipo “Windows Service”, poi modifichiamo le proprietà del servizio dalla finestra delle proprietà: i tre booleani CanPauseAndContinue, CanShutDown, e CanStop determineranno il comportamento del servizio che stiamo sviluppando. Ovviamente la proprietà ServiceName serve ad indicare e impostare il nome. Notate inoltre che esiste anche il campo CanHandlePowerEvent, che serve a stabilire se potremo gestire i cambiamenti di stato dell’alimentazione.

il passo successivo consiste nell’aggiungere il codice di startup: tipicamente dobbiamo inserirlo nella funzione di gestione dell’evento OnStart event. Ecco un esempio elementare:

Protected Overrides Sub OnStart(ByVal args() As String)
    EventLog.WriteEntry( "Scrivi quello che vuoi.")
End Sub

Possiamo implementare il comportamento del nostro applicativo anche in relazione ad altri eventi, quali: OnContinue, OnCustomCommand, OnPause, OnShutdown, OnPowerEvent, e OnStop. Se e come farlo dipende in grandissima parte dagli obiettivi che ci siamo prefissi con la creazione del nostro progetto, ma è piuttosto evidente che di solito è necessario gestire almeno l’avvio, la pausa, la continuazione e la terminazione del servizio.

Può essere davvero importante tenere traccia delle attività della nostra applicazione tramite un log, ma per semplificare le cose ricordiamoci di impostare la proprietà AutoLog (della classe Service) a true, in modo che gli eventi basilari vengano loggati automaticamente. Se faremo ciò dovremo preoccuparci di loggare solo le operazioni o gli avvenimenti di carattere specifico.

Quando avremo finito il nostro sviluppo, dovremo anche preparare un installer (che sarà di tipo ServiceInstaller) che prenda il Windows service di nostra invenzione e lo installi nel sistema. Come si fa? Dobbiamo selezionare il progetto nel box del Solution Explorer e visualizzarne le proprietà: vedremo il link “Add Installer”, che fa al caso nostro. Seguiamo la procedura guidata, in modo da aggiungere l’oggetto installer che dovremo personalizzare.

Nel prossimo articolo di questa serie vedremo dettagliatamente come creare un service installer. ;-)

Come si automatizza la chiusura di un’applicazione console .NET?

Molte volte nei programmi che sviluppiamo abbiamo l’esigenza di predisporre la loro chiusura in base a certe condizioni: tipicamente richiamiamo il metodo Exit() della proprietà Application nella funzione che gestice il click sulla voce di menu “esci” (nel caso il nostro sia un progetto Windows Forms e la form in questione abbia un menu, ovviamente). Nel caso di un’applicativo di tipo console, tuttavia, questo metodo non è accessibile. Come si può dunque automatizzarne la chiusura?

Questa è la norma da seguire: se operiamo in un contesto visuale, usiamo Application.Exit(); se operiamo invece in ambito console, dobbiamo usare Environment.Exit(0). Facendo questo termineremo l’eseguibile ed invieremo al sistema operativo sottostante il codice di uscita specificato, che normalmente è 0.

Il piccolo trucchetto illustrato in questo breve articolo può essere comodo quando vogliamo supportare in modo intelligente la schedulazione del nostro programma: possiamo far sì che possa richiedere la pressione di un tasto qualunque prima di chiudersi (adatto all’uso diretto) e che possa anche chiudersi automaticamente dopo alcuni secondi di attesa (adatto all’uso batch).

Wrapper in C# per le API PostRank

Stai per caso lavorando su un’applicazione C# e stai cercando di integrare le API PostRank? Ebbene, grazie a William Spaetzel potrai raggiungere quest’obiettivo molto più facilmente. Ha pubblicato una libreria, scaricabile proprio dal suo sito, la quale opera da wrapper per tutte le chiamate alle API PostRank.

È semplice da usare e questa è la cosa fondamentale quando stiamo sviluppando un’applicazione complessa e dobbiamo includere componenti simili, non vi pare? Il pacchetto scaricabile comprende anche un piccolo programma d’esempio, che illustra l’uso basilare di tutti i metodi forniti. Il codice è rilasciato sotto la licenza Creative Commons Attribution 3.0: chiunque può riutilizzare e modificare i sorgenti, purché si continui a citare Spaetzel come l’autore originale. Direi che come minimo è da provare… ;-)

Quando dovremmo usare ClickOnce?

Archi rocciosi del National Park dello Utah

Foto di James Gordon.

Un’applicazione ClickOnce è un programma Windows Forms, console o un web service, pubblicato attraverso la funzionalità di rilascio ClickOnce integrata in Visual Studio .NET (versione 2005 o superiore). Tale tecnologia è accattivante in quanto è possibile decidere se il software verrà installato sul computer dell’utente finale, oppure se dovrà operare solamente online (non installando nulla in modo permanente). Un altro aspetto rilevante è il sistema di autoaggiornamento, già implementato e compreso nella pubblicazione ClickOnce. Ovviamente lo sviluppatore può specificare le modalità di aggiornamento. Probabilmente saprete che è anche possibile fare il rollback ad una versione precedente del software, se necessario.

Apparentemente ClickOnce potrebbe sembrare il massimo, “una pacchia”, per così dire. In realtà, nell’ambito professionale molte volte questa strada potrebbe non essere molto comoda. Perché? Un primo motivo è che bisogna per forza avere l’accesso FTP al server dove dovrà essere installato l’applicativo, cosa non sempre possibile. Lo stesso ragionamento si può fare in relazione ai web reference: senza l’accesso ai web service installati dal cliente non è possibile modificare il progetto sulla macchina di sviluppo, aggiungere o modificare i web reference e pubblicare! Come potete facilmente immaginare, pubblicare con i riferimenti errati e correggerli dopo è tutt’altro che semplice, dato che vanno modificati in vari files generati automaticamente dall’IDE di sviluppo.

In conclusione, quando dobbiamo usare ClickOnce? Se abbiamo la connettività descritta prima e se vogliamo usufruire di una distribuzione agevolata del nostro programma, per non parlare della feature di aggiornamento automatico, allora è la soluzione che fa per noi, In caso contrario, forse dovremo optare per un Installer MSI o altro ancora.

Come ricavare il numero di versione di una Console Application in .NET

Come si può ottenere a runtime il numero di versione completo di un programma di tipo console? Nelle applicazioni Windows Forms useremmo semplicemente la proprietà Application.ProductVersion, ma in questo caso bisogna adottare un altro sistema: quale?

Dobbiamo usare la reflection. Per andare dritti al punto, ecco il codice d’esempio:

Imports System.Reflection;
[...]
Assembly aAssembly = Assembly.GetCallingAssembly()
AssemblyName anName = aAssembly.GetName()
Console.WriteLine(”{0}{1} {2:0}.{3:0}”, anName.Name, anName.Version.Major.ToString(), anName.Version.Minor.ToString())

In sostanza, come potete constatare, il numero di versione è memorizzato nella proprietà Version dell’istanza di AssemblyName associata all’assembly corrente. Buono a sapersi, non è vero?