26/11/09

A vueltas con el Event Viewer

Recientemente me he tenido que pelear con la generación de instaladores MSI con WIX, o sea, que como diría Clint "He descubierto un mundo de dolor". Una de las cosas que hay que hacer es dar mensajes al usuario durante la instalación para que sepa cómo está funcionando todo. La información tiene que ir tanto en la ventana interactiva del instalador como en el Visor de Sucesos de Windows.

Pues bien, después de mucha pelea acabé con una CustomAction que incluye el siguiente código que hace las dos cosas a la vez:


private static void Log(Session session, string message)
{
EventLog.WriteEntry(
"MsiInstaller",
message,
EventLogEntryType.Information,
1000);

var recordInfo = new Record(3);
recordInfo[2] = message;
session.Message(
InstallMessage.ActionStart,
recordInfo);
}

Utilizo la Event Source MsiInstaller porque creo que siempre va a estar creada, con lo que se evita el problema de que el usuario no tenga permisos para crear la fuente de eventos.


Gracias a NETIKUS por explicar qué demonios es el Event Id y por qué tengo que poner un "1000". De hecho, si no ponemos el Identificador de evento, nos encontraremos con un extraño error que dice algo como:


The description for Event ID ([Event Id]) in Source ([Nombre_Fuente]) could not be found. 
It contains the following insertion string(s): ....

Esto ocurre porque los eventos del visor responden a una tabla con mensajes predefinidos con un formato específico, por ejemplo "No se pudo instalar el servicio %1" donde cada símbolo es sustituible por un parámetro. El formato del 1000 es simplemente "%1" así que podemos poner lo que queramos.

No hay comentarios: