| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  28-10-2008, 13:13 | #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   | 
|   |   | 
|  30-10-2008, 11:06 | #2 | 
| Senior Member Iscritto dal: Sep 2004 
					Messaggi: 3967
				 | 
		uppettino    
				__________________ Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek   | 
|   |   | 
|  30-10-2008, 11:52 | #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   | 
|   |   | 
|  30-10-2008, 13:29 | #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);
				__________________   | 
|   |   | 
|  30-10-2008, 14:03 | #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   | |
|   |   | 
|  30-10-2008, 18:36 | #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. | 
|   |   | 
|  31-10-2008, 12:55 | #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: 00:49.









 
		 
		 
		 
		








 
  
 



 
                        
                        










