Salve ragazzi, ho creato una classe con le directshow.net e ho un problema... praticamente la classe si occupa di prendere il video dalla webcam. In poche parole una volta istanziato l'oggetto, dichiaro handle e l'indice del device che deve usare e mi mostra il video.

Il problema è questo: Il video rimane giustamente aperto finché non lo chiudo con un commando (che è presente anche nel distruttore della classe).

Se premo un bottone che scatena "Application.Exit()" (ovvero chiude tutti i form ed esce dal loop costringendo Application.Run() a tornare). L'oggetto della webcam non viene distrutto causando errore.

Se avvio il commando di chiusura tramite altro bottone, posso chiudere e tutto va bene, ma se la webcam è ancora aperta, non fa in tempo a chiamare il distruttore dell'oggetto e fa errore!

Infatti ho dovuto fare un "walkaround":

Nel form dove richiamo la classe ho dovuto mettere un evento "onClosing" in modo che forzo il form in chiusura (quando viene premuto Application.Exit) a richiamare la funzione che dovrebbe in teoria richiamare il distruttore..

in poche parole:
Se non utilizzo manualmente il distruttore, questo non viene richiamato.

Il distruttore è dichiaro in modo semplice:
codice:
~webcam()
{    
     this.CloseInterfaces();
}
L'unico modo per costringerlo ad eseguire this.CloseInterfaces() è richiamare dal form un evento OnClosing e forzarlo da lì. Qualche suggerimento?

codice:
namespace Jarvis 
{ 
    class webcam 
    {
        
         public string DeviceName, DevicePath; 

         ~webcam() 
         { 
             this.CloseInterfaces(); 
         }


...................


        public void CloseInterfaces()
        {
            // Stop previewing data
            if (this.mediaControl != null)
                this.mediaControl.StopWhenReady();

            // Stop receiving events
            if (this.mediaEventEx != null)
                this.mediaEventEx.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);

            // Relinquish ownership (IMPORTANT!) of the video window.
            // Failing to call put_Owner can lead to assert failures within
            // the video renderer, as it still assumes that it has a valid
            // parent window.
            if (this.videoWindow != null)
            {
                this.videoWindow.put_Visible(OABool.False);
                this.videoWindow.put_Owner(IntPtr.Zero);
            }

            // Remove filter graph from the running object table
            if (rot != null)
            {
                rot.Dispose();
                rot = null;
            }
        }
    }
}