Salve a tutti, ho un annoso problema a cui non riesco a venire a capo:

Premetto che il mio scopo è quello di creare un form PADRE di tipo MDI ed accogliere tanti MDI-Child quanti sono gli eseguibili che vengono trovati in una determinata directory, utilizzando la tecnica dei plug in applicata alle dll (http://vbnotebookfor.net/2007/10/09/...-ins-in-vbnet/) ma usando degli eseguibili EXE (generati sempre con VB).
In pratica io andrei a creare una specie di "MasterPage" che viene integrata con nuovi programmi e funzionalità a seconda di quanti sono gli eseguibili disponibili.

I passaggi effettuati sono:
  1. Creazione di un form 'PADRE' mdi che implementa un interfaccia che chiameremo IPadre
  2. Creazione della DLL con le interfacce IPadre e IFiglio
  3. Creazione di uno o piu eseguibili che implementano l'interfaccia IFiglio


Fino a questo momento è tutto ok funziona tutto alla perfezione, nel form Padre per ottenere l'elenco delle form che implementano l'interfaccia IFiglio uso un ciclo e controllo con la reflection i tipi implementati dagli assemblyes, se trovo quello che mi interessa attivo un istanza del .exe e salvo tale istanza in un hashtable:

codice:
 Dim Plugins As New Hashtable
 Private Sub CercaPlugIn()
        Plugins.Clear()
        Dim Cartella As String = Application.StartupPath
        'cerchiamo tutti file dll nella directory del programma

        Dim Files() As String = System.IO.Directory.GetFiles(Cartella, "*.exe")
        Dim File As String
        For Each File In Files
            Try
                'carichiamo i file trovati
                'notate che stiamo usando la reflection

                Dim Assembly As Reflection.Assembly = Reflection.Assembly.LoadFile(File)
                Dim tipo As Type
                For Each tipo In Assembly.GetTypes
                    'cerchiamo le istanze del tipo IFiglio

                    Dim iface As Type = tipo.GetInterface("funzioniPadre.Interfaccia.IFiglio")
                    If Not (iface Is Nothing) Then
                        'creiamo l'istanza del plugin-
                        Dim plugin As IPlugIn = Activator.CreateInstance(tipo)
                        'salviamo l'istanza in hashtable

                        Plugins.Add(plugin.Name, plugin)
                    End If
                Next
            Catch ex As Exception
                MsgBox("Impossibile caricare un programma. Messaggio restituito: " & ex.Message, MsgBoxStyle.Exclamation)
            End Try
        Next
    End Sub
Ora arriviamo al problema:

Il programma FormPadre con tutti i vari PlugIn 'Figlio' risiedono in una cartella condivisa nella nostra rete, ogni client esegue il programma padre ed utilizza i vari sottoprogrammi visti come 'estensioni' del programma padre.
Il problema nasce quando devo fare l'aggiornamento di un singolo programma figlio:
il fatto che il padre crea una istanza di ogni figlio, di fatti, blocca il file EXE sottostante fino alla chiusura del form padre anche se il form figlio NON è in esecuzione.
Come fare a distruggere l'istanza creata con Activator.Createistance dalla memoria una volta che detta istanza della form figlio viene chiusa senza chiedere a tutti gli utenti di chiudere anche il form PADRE??? Sto letteralmente impazzendo, so che non è un problema di facile soluzione, e Dio Google non ha prodotto una soluzione per il mio caso.
Scrivo qui nel fortuito caso in cui un utente di questo forum abbia dovuto affrontare un problema simile...

Grazie a tutti anche solo per la lettura del lungo testo.