
Originariamente inviata da
Frungillo
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:
- Creazione di un form 'PADRE' mdi che implementa un interfaccia che chiameremo IPadre
- Creazione della DLL con le interfacce IPadre e IFiglio
- 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.