|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C#]Semplice Servizio
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: Codice:
//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);
}
}
}
Il problema che ho è quando cerco di installare il servizio e di avviarlo: questo è il log dopo: Codice:
InstallUtil /LogToConsole=true TestBatchCopy.exe Codice:
//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. Codice:
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. grazie mille. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
uppettino
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Ok.. servizio installato ed avviato correttamente. Dovevo solo specificare meglio il tipo di account...
Ad ogni modo... non funziona L'unico task che dovrebbe eseguire (contenuto nel file BatchCopyAction), non viene eseguito. Chi mi da un aiutino? Grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
prova a scrivere nel main:
Codice:
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new BatchCopy() };
ServiceBase.Run(ServicesToRun);
__________________
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
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.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
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.. ![]() EDIT: o meglio.. non so come funziona il timer quindi mi sfugge se gira automaticamente in un altro thread..
__________________
Ultima modifica di ^TiGeRShArK^ : 30-10-2008 alle 18:41. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
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.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:21.




















