2011-02-02 14 views
7

Obtuve un proyecto de instalación que instala un servicio de Windows.Proyecto de instalación para un servicio de Windows y el registro de eventos

Estamos registrando un origen de registro de eventos en un registro personalizado que debe ser utilizado por el proyecto de winservice (cómo y por qué no es importante).

Mi problema es que el proyecto de instalación intenta crear un origen de registro de eventos por defecto. Al hacerlo, aparece un mensaje de error ("Error 1001" source XXX already exists on local computer) y retrocede.

He buscado en todas partes y no puedo encontrar dónde se realiza el registro o cómo puedo desactivarlo.

¿Cómo puedo forzar el servicio de Windows o configurar el proyecto para NO crear un origen de registro de eventos?

Respuesta

7

Se puede quitar el defecto EventLogInstaller:

namespace MyService 
{ 
    [RunInstaller(true)] 
    public partial class ProjectInstaller : Installer 
    { 
     public ProjectInstaller() 
     { 
      InitializeComponent(); 

      // Remove the default Event Log Installer 
      EventLogInstaller DefaultInstaller = null; 
      foreach (Installer installer in serviceInstaller1.Installers) 
      { 
       if (installer is EventLogInstaller) 
       { 
        DefaultInstaller = (EventLogInstaller)installer; 
        break; 
       } 
      } 
      if (DefaultInstaller != null) 
      { 
       serviceInstaller1.Installers.Remove(DefaultInstaller); 
      } 
     } 
    } 
} 

Alternativamente, se puede modificar el Log propiedad:

foreach (Installer installer in serviceInstaller1.Installers) 
{ 
    if (installer is EventLogInstaller) 
    { 
     ((EventLogInstaller)installer).Log = "MyLog"; 
     break; 
    } 
} 

Ahora los eventos se registrarán satisfactoriamente en MyLog, y los eventos de inicio/detención del servicio aún se registrarán en el registro de la aplicación .

(fuente: serviceInstaller component and its default EventLogInstaller)

+0

Tenga en cuenta que es importante incluir "ServiceInstaller1" en la línea 'foreach (instalador de instalación en serviceInstaller1.Installers)'. Lo escribí como 'foreach (Instalador instalador en this.Installers)'. Esto creó bien y el proyecto de instalación creó el archivo MSI. Pero el error persistió cuando intenté instalar el servicio. Fue solo cuando cambié "this.Installers" a "serviceInstaller1.Installers" que se corrigió el error. –

2

Esto es solo una suposición basada en mis pruebas.

El proyecto de instalador (o la clase WindowService) crea automáticamente un origen de eventos con el mismo nombre que myService.ServiceName. Esto es más probable porque los mensajes de inicio/detención se escriben en el registro cada vez que se inicia/detiene un servicio. Y esos mensajes necesitan una fuente.

En otras palabras: no es necesario crear una fuente con el mismo nombre que ServiceName como se hace para usted.

3

Supongo que cuando desinstala el servicio, algo no se desinstala correctamente, especialmente en el registro de eventos.

Para restaurar la capacidad de volver a instalar el servicio de nuevo, descubrí (thanks to this article) que necesita para eliminar esta clave en el registro (regedit.exe):

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\YOURSERVICENAME 
Cuestiones relacionadas