Bisogna vedere cosa intendi per: "Smette di funzionare". Se smette ma resta "aperta" con un qualche messaggio di errore il controllo è un attimino più complicato, anche se fattibile.
Se invece si chiude proprio... basta una seconda piccola applicazione lanciata "in tandem" con la prima che con un timer controlla regolarmente in "Process.GetProcessesByName" se l' applicazione principale è aperta o no, e nel caso la lancia "again and again".
Io cmq metterei TUTTO il codice, Sub per Sub, Function per Function, in Try... Catch... è alquanto strano che gli errori non vengano rilevati.