Discussione: [C#]Semplice Servizio
View Single Post
Old 28-10-2008, 13:13   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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);
        }

    }
}
Compila senza errori e senza warning.

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.
e questo invece il log del servizio:
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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso