358 messaggi dal 11 luglio 2003
Ho un exe che si appoggia ad una DLL, nella DLL creo una form(quindi nell'exe io non ho nessun riferimento a questa form) e vorrei che cliccando su un button di questa form mi venga richiamata una funzione presente nel mio exe.

VB.NET

E' fattibile?

No comment...
11.886 messaggi dal 09 febbraio 2002
Contributi

E' fattibile?


Sì, devi iniettargli la dipendenza :)

Il punto è che se la dll ha bisogno di una funzionalità che si trova nell'exe, non deve andarsela a cercare lei, ma è l'exe che deve fornirgliela.

Quando dall'exe crei un'instanza dell'oggetto che si trova nella dll, devi passargli nel costruttore quello che gli serve per lavorare.

L'ideale sarebbe creare un'interfaccia nella dll. Una tipo questa (puoi usare i nomi che vuoi):

Public Interface IFunzionalita
    Sub FaiQualcosa(ByVal parametro As String)
End Interface


La Sub FaiQualcosa, in questo esempio, è tutto ciò che la dll ha bisogno per lavorare. Chiamerà quella Sub nel momento opportuno.

Ora, modifica il costruttore dell'oggetto che si trova nella dll affinché accetti un parametro di tipo IFunzionalita

Private _funzionalita As IFunzionalita
Public Sub New(ByVal funzionalita As IFunzionalita)
   _funzionalita = funzionalita
End Sub

Qui sopra non faccio altro che copiarmi in un campo privato il valore che ho ricevuto come parametro del costruttore.
Ora che ho "parcheggiato" la referenza in un campo privato, potrò eseguire il metodo .FaiQualcosa quando voglio.

_funzionalita.FaiQualcosa("valore")


Infine, nell'exe, devi fare in modo che l'oggetto che si trova lì implementi questa interfaccia. Per esempio:

Imports NamespaceDellaDll
Public Class OggettoExe
    Implements IFunzionalita

    Public Sub FaiQualcosa(ByVal parametro As String)
        'qui dentro metti il codice che la dll manderà in esecuzione
    End Sub
End Class


Tutta questa preparazione è servita a fare in modo che quando l'oggetto dell'exe istanzia quello della dll possa passare esso stesso come parametro del costruttore:

Dim oggettoDll As New OggettoDll(Me)


Sembra complicato?
Modificato da BrightSoul il 23 giugno 2011 00.52 -

Enjoy learning and just keep making
358 messaggi dal 11 luglio 2003
Nonostante la risposta dettagliata mi sono bloccato su qualche punto, ti spiego cosa ho fatto, ho rapportato il tuo caso generale al mio caso che è una Form che contiene il Button che mi interessa:
Nella DLL ho messo:
Public Interface IFunzionalita
    Sub FaiQualcosa(ByVal parametro As String)
End Interface

Ho messo come variabile pubblica:

Public _funzionalita As IFunzionalita


Alla Form ho aggiunto il costruttore:
  Public Sub New(ByVal Funzionalità As IFunzionalita)
        _funzionalita = Funzionalità

        ' Chiamata richiesta dalla finestra di progettazione.
        InitializeComponent()

        ' Aggiungere le eventuali istruzioni di inizializzazione dopo la chiamata a InitializeComponent().

    End Sub

e nell'EXE ho creato una classe:
Public Class OggettoExe
    Implements Common.IFunzionalita

    Public Sub FaiQualcosa1(ByVal parametro As String) Implements Common.IFunzionalita.FaiQualcosa
        MsgBox("carrttrd")
    End Sub
End Class


Adesso quando richiamo la Form1 mi dice che richiede un parametro di tipo IFunzionalità, che gli passo?
Ps. io la DLL la importo solo senza creare richiamare alcun costruttore.
Ciao e grazie.

No comment...
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, mi manca un'informazione: cos'è che scatena la creazione della form che si trova nella dll? Non può istanziarsi da sola, giusto? Penso che la form venga creata in seguito a qualche evento che si verifica nell'exe, come per esempio il click di un bottone nella form principale.

E' questa form principale, che si trova nell'exe, che deve implementare Common.IFunzionalita. Non devi creare un nuovo oggetto. E' la stessa form che contiene la funzionalità di cui la dll necessita.


nella DLL creo una form(quindi nell'exe io non ho nessun riferimento a questa form)


Comunque credo di aver capito il punto. Tu dall'exe istanzi qualcosa che si trova nella dll ed è questo qualcosa, ad un certo punto, a creare la form.
Beh, devi passare L'IFunzionalita di mano in mano, di costruttore in costruttore.

Nell'exe, creerai l'oggetto che si trova nella dll, passandogli Me come riferimento, cioè la form principale che implementa IFunzionalita
Dim oggetto As New OggettoNellaDll(Me)


Questo è il costruttore di OggettoNellaDll (scusa ma sono arrugginito col VB.NET)
Private _funzionalita As IFunzionalita
Public Sub New(ByVal funzionalita As IFunzionalita)
   _funzionalita = funzionalita
End Sub


E l'oggetto, a sua volta, creerà una nuova Form, inoltrandogli la referenza che aveva ricevuto nel suo costruttore.

Dim form As New FormNellaDll(_funzionalita)
form.Show()


Se si potessero allegare file ti manderei una soluzione di Visual Studio. E' più facile a spiegarsi col codice che a parole :/
Modificato da BrightSoul il 23 giugno 2011 00.51 -

Enjoy learning and just keep making
358 messaggi dal 11 luglio 2003
Il mio problema nasceva proprio dal fatto che dal mio exe avvio una funzione della DLL che mi crea i menu e relativi Handler, perciò dicevo che nell'EXE non ho nessun riferimento alle form che vengono create...però ho seguito il tuo consiglio del passare L'IFunzionalita di mano in mano, di costruttore in costruttore
e sono riuscito nell'intento, adesso sto facendo delle prove, vorrei farmi ritornare il riferimento alla Form(così da poter ciclare sui campi...), voglio creare una classe a parte dove mettere tutte le funzioni di ritorno, lasciando stare la MainForm...
Grazie mille, alla prossima.

No comment...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.