Ejecutar Procesos DotNet de manera Controlada

Se me plantea la siguiente necesidad:

"… tenemos un proceso complejo de trasferencia de datos entre dos sistemas construido en una aplicación de consola dotnet. Como es muy compleja, no podemos tocarla, es decir es un Pragma[1] para nosotros. Necesitamos controlar la ejecución de este proceso, es decir que se ejecute y si hay errores se notifique a los administradores…… ¿Qué podemos hacer?…."

Bueno, al ser una aplicación dotnet, la cosa se pone simple. Si usted nunca se ha detenido a considerar que significa que dotnet use código administrado, prepárese porque aquí va a disfrutar una de las ventajas de este tipo de código.

La solución más simple para esto es hacer que una aplicación que llamaremos "Controlador" sea quien ejecute el "Pragama" que llamaremos en este Post "Proceso". La idea es que el Controlador ejecute el Proceso en su mismo AppDomain[2] utilizando las facilidades que el Framewok da para ello. Esto se muestra en el siguiente código. Específicamente se usa el método ExecuteAssembly[3].

 

static
void Main(string[] args)

{


string[] strArgumentoControl= new
string[1];

 

Console.WriteLine("Ejecutar?");

Console.WriteLine("Ingrese Argumento de Control: ");

strArgumentoControl[0] = Console.ReadLine();


try

{


AppDomain.CurrentDomain.ExecuteAssembly(

@"..\Proceso\bin\Debug\Proceso.exe",null,strArgumentoControl );

}


catch (Exception X)

{

Console.WriteLine("Error: " + X.Message);

 

}

Console.ReadLine();

}

Código 1

Lo que hace esto es ejecutar en el mismo dominio de aplicación el Proceso, que está implementado en Proceso.exe. El tercer argumento del método los argumentos que se le pasan al programa que se está ejecutando.

Hasta ahora nada muy impresionante, esto es lo bueno. Si en el Proceso.exe se levanta una excepción (aspecto que dotnet maneja muy bien) está es atrapada por el Try/Catch del Controlador. Esto es porque los dos programan son código administrado y pueden compartir la información de las excepciones.

Veamos el Proceso de ejemplo, está en el código 2. Dependiendo del argumento que se le pase Proceso levanta diferentes Excepciones o termina de manera exitosa. Fíjense que no se controlan excepciones aquí, la idea es que si el proceso falla por cualquier motivo sea el Controlador quien se haga cargo.

 

class
Program

{


static
void Main(string[] args)

{

Console.WriteLine("Ejecutando Proceso Controlado……………");


switch (args[0])

{


case
"1":


throw
new Exception("Error Tipo Uno");


case
"2":


throw
new Exception("Error Tipo Dos");


case
"3":


throw
new Exception("Error Tipo Tres");


case
"4":


int iCero = 0;

Double dNada;

dNada = 100 / iCero;


break;


default:

Console.WriteLine("Todo Bien :)");


break;

}

Console.WriteLine("Terminó Proceso Controlado……………");

}

}

Código 2

 

Eso es todo, esto puede ser mucho más sofisticado agregando lógica en Controlador para que distinga los tipos de excepciones, notificaciones, reintentos, etc…etc…

El Código de ejemplo pueden descargarlo desde Aquí

Referencias

[1] Pragma, Pragma a diferencia de un sistema, es algo que se usa "por los bordes" Es decir no se comprende su interior.

[2] AppDomain, http://msdn2.microsoft.com/en-us/library/system.appdomain.aspx

[3] ExecuteAssembly, http://msdn2.microsoft.com/en-us/library/system.appdomain.executeassembly.aspx

Anuncio publicitario

2 comentarios en “Ejecutar Procesos DotNet de manera Controlada

  1. Juan Pablo

    Hola,
     
    Sí lo simple es bueno y aplica perfectamente con el requerimiento solicitado.

    Siempre he pensado que la ingeniería es solucionar problemas con ingenio, pero si esas soluciones además son simples es un punto extra.
    Salu2

    Responder

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s