Monitorare Programma Winforms .NET

martedì 19 febbraio 2008 - 08.54

Niddu Profilo | Newbie

Salve ragazzi comincio col dire che non ho molta esperienza con le Windows Form.
C'è una applicazione WinForms scritta in vb.net che ha molti problemi di affidabilità, per questo mi è stato chiesto di realizzare un programma esterno al primo che monitorasse l'applicazione in questione, tracciando l'esito(positivo o negativo) ed eventualmente intercettare l'errore che esce fuori da un malfunzionamento.
Ma io non ho proprio idea di come poter intercettare gli eventi di una applicazione scritta in vb.net al di fuori della stessa...ci sono delle librerie apposite? e come si intercettano gli errori che l'applicazione genera?
mi potete guidare?

Ferux Profilo | Newbie

Salve,
potresti utilizzare nell'app VB .Net la classe EventLog del namespace System.Diagnostics e scrivere nel registro eventi.
Poi se vuoi puoi fare un'app che legge il registro eventi o collegarti tu stesso al registro eventi (dal run as eventvwr.msc).

Guarda qui:
http://msdn2.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

Saluti


Ing Ferux
[MCP MCAD]

Niddu Profilo | Newbie

grazie della risposta.
il mio problema però è che non posso toccare l'applicazione che devo monitorare, quindi devo creare dall'esterno un'altra appliczione che sappia leggere gli eventi della prima appliczione.
leggendo il registro eventi di windows posso intercettare questi errori?

Ferux Profilo | Newbie

Salve,
ovviamente se l'applicazione che non puoi toccare di suo va a scrivere negli registro eventi la risposta è affermativa.
Se invece l'applicazione è una black-box, secondo me puoi sempre leggere il registro eventi nel caso in cui causi errori o generi eccezioni, questo credo lo trovi sotto la voce System del registro eventi o Application.
Comunque tramite la classe Process puoi monitorare il processo che viene lanciato quando avvi la tua applicazione e verifcare se l'occupazione di memoria cresce (Memory Leak) ed altre cosucce.

come riferiemnti puoi guardare:

http://msdn.microsoft.com/library/ita/default.asp?url=/library/ITA/vbcon/html/vbwlkWalkthroughManagingNTProcesses.asp


Spero di esserti stato di aiuto
Saluti
Ing Ferux
[MCP MCAD]

Niddu Profilo | Newbie

seguendo l'indicazione ho cominciato a lavorare con i processi e sta andando bene, nel senso che sono riuscito ad intercettare l'errore e salvarlo quinti ok.
Il problema ora è che io uso il "WaitForExit" del mio processo, ma se non intervengo manualmente sull'altra applicazione chiudendola, il programma rimane appeso, perche quando si genera l'errore non si chiude automaticamente l'appliczione.
Supponendo che io non possa intervenire sull'applicazione che mi da l'errore, come posso chiuderla dopo che la stessa è andata in errore dal programma di monitoraggio dove lancio il processo e aspetto l'uscita dell'applicazione?
grazie

Ferux Profilo | Newbie

Ciao,
devi recuperare l'elenco dei processi tramite la funzione GetProcesses() della classe Process poi quando trovi il processo di interesse utilizzi il metodo Kill():

Saluti
Ing Ferux
[MCP MCAD]

Niddu Profilo | Newbie

Intanto grazie delle risposte.
io sono dell'idea che per monitorare un applicazione sia ideale farlo dall'interno, ma mi è stato chiesto di non toccare il codice di questa applicazione(motivazioni aziendali che non conosco) e di creare un'altra applicazione esterna alla prima che si occupi di monitorare semplicemente se la procedura va a buon fine o se si verificano delle eccezioni, nel qual caso scrivere su un file di log il dettaglio dell'errore.
Ho cominciato a lavorare con i processi di diagnostica, ho lanciato l'applicazione in questione dentro al mio processo e attendo una risposta; il problema è che sia nel caso che vada a buon fine, sia nel caso generi un eccezione l'applicazione di monitoraggio deve aspettare un input da parte dell'utente. vi allego il codice:

Dim Prc As New System.Diagnostics.Process
Dim ProcessStartInfo As New ProcessStartInfo
Prc.StartInfo.UseShellExecute = False
Prc.StartInfo.RedirectStandardError = True
Prc.StartInfo.RedirectStandardInput = True
Prc.StartInfo.RedirectStandardOutput = True
Prc.StartInfo.FileName = "Processo.exe"
Prc.Start()
Prc.WaitForExit()
If Prc.ExitCode <> 0 Then
Dim stdErr As StreamReader = Prc.StandardError
Scrivo l'errore
Else
Dim stdErr As StreamReader = Prc.StandardOutput
Scrivo l'errore
End If

C'è un modo per forzare la chiusura della prima applicazione quando genera un errore senza che l'utente debba dare l'input? perche purtroppo non ho idea di quanto ci possa mettere, e cmq non sempre ci mette lo stesso tempo....
oppure esiste una soluzione analoga seguendo un'altra strada?
Grazie
PS: l'applicazione è un'applicazione Windows Form scritta in vb.net, ma è stata scritta da un non programmatore, quindi non ci sono log o altre cose per evidenziare gli errori internamente.

Niddu Profilo | Newbie

ora vi chiedo un'altra cosa: allo stato attuale con il metodo SendKeys (attraverso la funzione FindWindow di "user32.dll")riesco a intercettare la finestra che appare in caso di errore e simulare il click sul tasto "Fine" per chiudere la finstra di errore. Ma se volessi anche leggere cosa c'è scritto nel messaggio di errore della finestra nella sezione dove c'è il call stack di dove è avvenuto l'errore?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5