Life in DotNet

Tutto sulla programmazione in .Net linguaggio C# piattaforma asp.net e sharepoint

agosto 2010 - Post

Errore pubblicazione post

Scusate ragazzi ho commesso un errore nella pubblicazione del seguente post pubblicandolo su internet ma privo di contenuti.

Adesso il problema รจ risolto. ;)

 

Buona lettura, scusate alla prossima!

C# Creare un Servizio Windows - Part3

Riepilogo Link:

Parte 1 

Parte 2

Parte 3

 

In quest’ultima parte, quella sicuramente più interessante verrà descritto come visualizzare una Form Custom nella quale impostare un valore nel file di configurazione, nel nostro caso imposteremo due valori:

1) il tempo di intervallo del timer,

2) una folder nella quale salvare eventuali file di esempio

Prima di tutto creiamo il file di configurazione nel quale inseriremo le due voci:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="timerInterval" value="10000"/>
    <add key="folderTemp" value="c:\temp"/>
  </appSettings>
</configuration>

Adesso creiamo una WindowsForm dalla quale andremo ad impostare il tempo di intervallo del timer in millisecondi e una folder nella quale salvare dei file di testo:

image

Nel costruttore della nostra Form andremo a leggere i valori di default, impostati nel file di configurazione, per prevalorizzare le nostre textBox:

public FrmSetTimer()
{
    InitializeComponent();
 
    Configuration c = ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetExecutingAssembly().Location);
    AppSettingsSection section = (AppSettingsSection)c.GetSection("appSettings");
 
    txtFolder.Text = section.Settings["folderTemp"].Value;
    txtTimer.Text = section.Settings["timerInterval"].Value;
}

Sul click del pulsante sfoglia andremo ad utilizzare un oggetto “FolderBrowserDialog” per poter far selezionare una directory dall’utente:

private void btnSfoglia_Click(object sender, EventArgs e)
{
    using (var folderDialog = new FolderBrowserDialog())
    {
        folderDialog.RootFolder = Environment.SpecialFolder.MyComputer;
        folderDialog.SelectedPath = Environment.GetFolderPath(folderDialog.RootFolder);
 
        if (folderDialog.ShowDialog() == DialogResult.OK)
        {
            txtFolder.Text = folderDialog.SelectedPath;
        }
    }
}

 

Sul click del pulsante “Salva” andremo a salvare i valori nel file di configurazione della nostra applicazione:

private void btnSalva_Click(object sender, EventArgs e)
{
    Configuration c = ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetExecutingAssembly().Location);
    AppSettingsSection section = (AppSettingsSection)c.GetSection("appSettings");
 
    section.Settings["folderTemp"].Value = txtFolder.Text;
    section.Settings["timerInterval"].Value = txtTimer.Text;
    
    c.Save();
 
    this.Close();
}

 

Adesso abbiam creato la nostra form custom ma dobbiamo intercettare l’evento OnAfterInstall per poterla mostrare all’utente.

Ci posizioniamo nel file projectInstaller.cs e richiamiamo l’override del metodo OnAfterInstall, di seguito il codice:

protected override void OnAfterInstall(IDictionary savedState)
{
    Thread temp = new Thread(new ThreadStart(ShowCustomDialog));
    temp.SetApartmentState(ApartmentState.STA);
    temp.Start();
 
    while (temp.ThreadState == ThreadState.Running)
        Thread.Sleep(2000);
}

Come potete notare la form la stiamo eseguendo in un thread a parte, questo perché al suo interno viene utilizzato un oggetto di tipo “FolderBrowserDialog” che sembra funzionare solo se viene eseguito in un thread impostato su “SingleThreadApartment”, infatti la riga fondamentale è proprio la seguente: “temp.SetApartmentState(ApartmentState.STA);

Nel nostro metodo “ShowCustomDialog” non faremo altro che visualizzare la form:

private void ShowCustomDialog()
{
    FrmSetTimer frmSetConfigParam = new FrmSetTimer();
    frmSetConfigParam.ShowDialog();
}

Adesso durante l’installazione del nostro progetto ci verrà mostrata un immagine simile alla seguente:

image

 

Riepilogo:

In questo post, diviso in tre sezioni, abbiam visto come:

- creare un servizio windows ed il relativo Installer per aggiungerlo tra i servizi Windows,

- creare un progetto di setup per l’installazione,

- personalizzare un installazione modificando ad esempio il file di configurazione,

- utilizzare l’oggetto “FolderBrowserDialog” in una installazione personalizzata

 

Spero che possa esservi di aiuto,

Saluti Fabio

Posted: 5 ago 2010 18:12 da Fabio Russo | con no comments
Inserito sotto:
C# Creare un Servizio Windows - Part1

Salve ragazzi, ultimamente mi son imbattuto nello sviluppo di un servizio windows, niente di complicato, ma quando ho dovuto creare un progetto di setup per l’installazione ed aggiungere alcune customizzazioni ho riscontrato alcuni problemini per i quali ho ritenuto opportuno postarne le soluzioni.

 

Riepilogo Link:

Parte 1 

Parte 2

Parte 3

 

In questa prima parte descriverò come creare un servizio windows con VisualStudio 2010, poi seguirà una seconda parte dove indicherò come aggiungere il progetto di setup, ed infine nella terza parte (molto interessante) indicherò come aggiungere una Form Custom durante l’installazione il cui scopo è quello di memorizzare sul file di configurazione una directory selezionata dall’utente.

 

Aprire VisualStudio2010 e cliccare su “New Project…”:

image

 

Selezionare Windows Service come tipo di progetto, impostare il percorso dove salvare il progetto e dargli un nome:

image

Nel nostro esempio non faremo altro che una banale scrittura su EventViewer, quindi controlliamo se il source esiste altrimenti lo creiamo, ed aggiungiamo un oggetto di tipo Timer cosi da poter fare eventuali altre azioni allo scadere di un determinato intervallo:

protected override void OnStart(string[] args)
{
   if(!EventLog.SourceExists("TestMyService"))
       EventLog.CreateEventSource("TestMyService","Application");
   timer1 = new Timer();
   timer1.Interval = 10000; //Intervallo di 10 seconti
   timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
   timer1.Enabled = true;
}    

Nota: l’oggetto timer deve essere di tipo “System.Timers.Timer”, quindi anziché trascinarlo da designer che è un oggetto di tipo “System.Windows.Forms.Timer” l’ho dichiarata come istanza privata globale della classe:

public partial class Service1 : ServiceBase
{
   private System.Timers.Timer timer1;
   ...
}

Nell’evento timerElapsed non faremo altro che tracciare un log nell’eventViewer

void timer1_Elapsed(object sender, ElapsedEventArgs e)
{
    EventLog.WriteEntry("TestMyService","Timer scattato!");
}

 

Adesso il nostro servizio è pronto, compilandolo vedremo che non ci da nessun errore, passiamo quindi alla fase successiva e cioè quella dell’installazione fra i servizi windows

Posted: 5 ago 2010 17:08 da Fabio Russo | con no comments
Inserito sotto:
C# Creare un Servizio Windows - Part2

Riepilogo Link:

Parte 1 

Parte 2

Parte 3

In questo post verrà descritto come installare il nostro servizio windows.

La prima cosa da fare è aggiungere l’installer al nostro servizio in maniera tale che durante l’installazione esso verrà installato tra i servizi windows, quindi aprire la nostra classe Service1 in modalità designer e fare tasto destro “Add Installer”:

imageVerrà creata una classe che si chiama “ProjectInstaller” all’interno della quale c’è un “ProcessServiceInstaller” ed un “ServiceInstaller”. Selezioniamo serviceInstaller1 e nella finestra delle proprietà potremmo inserire un eventuale descrizione ed eventualmente scegliere il tipo di avvio del servizio (manuale,automatico o disabilitato):

image

Adesso possiamo aggiungere alla solution il progetto di setup, quindi tasto destro sulla solution e clicchiamo “Add—>New Project”:

image

Diamogli un nome e clicchiamo su Ok.

Adesso bisogna aggiungere un progetto di Output, quindi: Tasto destro sul progetto di tipo setup e clicchiamo su Add—>Project Output…

image Nella finestra che compare selezioniamo il nostro serivzio windows (MyWindowsService) ed indichiamo che è un “Primary Output” infine clicchiamo sul pulsante Ok:

image

 

Aggiungiamo adesso la chiamata all’ installer presente nel nostro servizio, quindi tasto destro sul progetto di tipo setup e clicchiamo su “View—>Custom Action”, su ognuna delle 4 cartelle presenti clicchiamo col “tasto destro—>Add Custom Action…” nella finestra che comparirà clicchiamo su “Application Folder” e quindi selezioniamo il nostro Primary output:

image

Alla fine avremo un customizzazione simile all’immagine seguente:

image

Il nostro setup è pronto per essere installato, ricompiliamo il nostro servizio e successivamente il nostro progetto di setup al termine  eseguiamo il file setup.exe e ci troveremo tra i servizi windows il nostro Service1:

image Se lo avviamo, vedremo che nell’eventviewer verrà tracciato un log ogni 10 secondi:

image

Posted: 5 ago 2010 17:07 da Fabio Russo | con no comments
Inserito sotto: