PDA

View Full Version : [C#]Semplice Servizio


RaouL_BennetH
28-10-2008, 13:13
Ciao a tutti :)

Mi sto cimentando (solo a fini didattici) a scrivere un piccolo servizio per windows passo dopo passo senza cioè utilizzare il wizard di visual studio.

Studiando vari esempi sono giunto a:


//scopo del programma di copiare dei file da una directory in un'altra
using System;
using System.ServiceProcess;
using System.Threading;

namespace TestCronService
{
public class BatchCopy : ServiceBase
{
private BatchCopyAction bc;
private Timer stateTimer;
private TimerCallback timerDelegate;

public BatchCopy()
{
this.ServiceName = "TestBatchCopy";
this.CanStop = true;
this.CanPauseAndContinue = false;
this.AutoLog = true;
}

protected override void OnStart(string[] args)
{

bc = new BatchCopyAction();
timerDelegate = new TimerCallback(bc.DoCopy);
stateTimer = new Timer(timerDelegate, null, 1000, 1000);

}

protected override void OnStop()
{

stateTimer.Dispose();
}

public static void Main()
{
Run(new BatchCopy());
}
}
}

//File BatchCopyAction.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace TestCronService
{
public class BatchCopyAction
{
private string source = @"c:\test";

private string destination = @"c:\test\Bck";

public void DoCopy(object stateObject)
{
try
{
if (Directory.Exists(source))
{
string[] fileInSource = Directory.GetFiles(source);
foreach (string fileName in fileInSource)
{
string sourceFile = Path.GetFileName(fileName);
string destFile = Path.Combine(destination, DateTime.Now.ToShortDateString().Replace("/", "-") + DateTime.Now.ToShortTimeString().Replace(".", "-") + sourceFile);
File.Copy(sourceFile, destFile, true);
}
}
}
catch (IOException ex)
{
Console.Write(ex.Message);
}
}

}
}

//File BatchCopyInstaller.cs
using System;
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace TestCronService
{
[RunInstaller(true)]
public class BatchCopyInstaller : Installer
{
private ServiceProcessInstaller processInstaller;
private ServiceInstaller serviceInstaller;

public BatchCopyInstaller()
{
processInstaller = new ServiceProcessInstaller();
serviceInstaller = new ServiceInstaller();
processInstaller.Account = ServiceAccount.LocalSystem;
serviceInstaller.StartType = ServiceStartMode.Manual;
serviceInstaller.ServiceName = "TestBatchCopy";
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
}

}
}


Compila senza errori e senza warning.

Il problema che ho è quando cerco di installare il servizio e di avviarlo:

questo è il log dopo:


InstallUtil /LogToConsole=true TestBatchCopy.exe




//log dell'installer

Esecuzione di un'installazione transazionale.

Inizio della fase di installazione.
Vedere il contenuto del file di log per informazioni sullo stato dell'assembly c:\TestCronService.exe.
Il file si trova in c:\TestCronService.InstallLog.

Si è verificata un'eccezione durante la fase di installazione.
System.Security.SecurityException: Origine non trovata, ma non è stato possibile eseguire la ricerca in uno o più log eventi. Log non accessibili: Security.

Sta iniziando la fase di ripristino dello stato precedente dell'installazione.
Vedere il contenuto del file di log per informazioni sullo stato dell'assembly c:\testCronService.exe.
Il file si trova in c:\testCronService.InstallLog.

Fase di ripristino dello stato precedente completata.

Installazione transazionale completata.



e questo invece il log del servizio:

Installazione dell'assembly 'c:\TestCronService.exe' in corso...
I parametri interessati sono:
logtoconsole = true
assemblypath = c:\TestCronService.exe
logfile = c:\TestCronService.InstallLog
Installazione del servizio TestBatchCopy in corso...
È in corso la creazione dell'origine di EventLog TestBatchCopy nel log Application...
Ripristino dello stato precedente dell'assembly 'c:\TestCronService.exe' in corso...
I parametri interessati sono:
logtoconsole = true
assemblypath = c:\TestCronService.exe
logfile = c:\TestCronService.InstallLog
Ripristino del log eventi allo stato precedente per l'origine TestBatchCopy.
Si è verificata un'eccezione durante la fase di ripristino dello stato precedente del programma di installazione di System.Diagnostics.EventLogInstaller.
System.Security.SecurityException: Origine non trovata, ma non è stato possibile eseguire la ricerca in uno o più log eventi. Log non accessibili: Security.
Si è verificata un'eccezione durante la fase di ripristino dello stato precedente. L'eccezione verrà ignorata e il ripristino dello stato precedente continuerà, tuttavia è possibile che non venga completamente ripristinato lo stato precedente l'installazione al termine dell'operazione.



:help:

grazie mille.

RaouL.

RaouL_BennetH
30-10-2008, 11:06
uppettino :help:

RaouL_BennetH
30-10-2008, 11:52
Ok.. servizio installato ed avviato correttamente. Dovevo solo specificare meglio il tipo di account...

Ad ogni modo...

non funziona :sofico:

L'unico task che dovrebbe eseguire (contenuto nel file BatchCopyAction), non viene eseguito.

Chi mi da un aiutino?

Grazie mille :)

RaouL.

^TiGeRShArK^
30-10-2008, 13:29
prova a scrivere nel main:

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new BatchCopy() };
ServiceBase.Run(ServicesToRun);

RaouL_BennetH
30-10-2008, 14:03
prova a scrivere nel main:

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new BatchCopy() };
ServiceBase.Run(ServicesToRun);


Niente da fare..

Ho fatto un'altra prova:

se provo a creare un semplice file di testo me lo crea.
La cosa strana è che me lo crea appena lancio il servizio e poi basta.
Credo quindi che l'utilizzo del Timer non sia corretto.

Grazie ancora.

RaouL.

^TiGeRShArK^
30-10-2008, 18:36
aspè...
Ma vedi che il timer lo dovresti lanciare in un thread a parte, altrimenti quando esci dalla onStart il timer ti muore ora che mi ci fai pensare.. :stordita:

EDIT: o meglio.. non so come funziona il timer quindi mi sfugge se gira automaticamente in un altro thread.. :fagiano:

RaouL_BennetH
31-10-2008, 12:55
aspè...
Ma vedi che il timer lo dovresti lanciare in un thread a parte, altrimenti quando esci dalla onStart il timer ti muore ora che mi ci fai pensare.. :stordita:

EDIT: o meglio.. non so come funziona il timer quindi mi sfugge se gira automaticamente in un altro thread.. :fagiano:

Mumble... potrebbe essere anche così.

Ciò però non mi spiega perchè almeno sulla OnStart non effettua la prima copia.

Il metodo che copia i file se lo utilizzo in un progetto eseguibile funziona, quindi escluderei che sia questo.

Come ulteriore prova ho anche utilizzato il wizard di visual studio ma il risultato è lo stesso: non avviene nulla.

Grazie mille.

RaouL.