Lanciare un'applicazione WPF da una WinForm

giovedì 26 agosto 2010 - 08.50
Tag Elenco Tags  VB.NET

lukepet Profilo | Junior Member

Ho un problema con una soluzione che sto cercando di sviluppare. Il mio scenario è questo: ho un'applicazione VB6 e vorrei riuscire a chiamare da questa applicazione alcune nuove finestre scritte in WPF. Ho usato l'Interop Form Library per definire una WinForm che funge da ponte tra VB6 e WPF. L'Interop WinForm espone i metodi per avviare ed arrestare l'applicazione WPF.

Per fare ciò, nell'applicazione WPF ho definito questa classe helper:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

il metodo DispatchEvent gestisce l'esecuzione di eventi specifici come l'apertura di una finestra.

Per esempio, nell'Interop WinForm ho scritto queste istruzioni:
MyWpfApp.StartApplicationHelper.Start() Do While MyWpfApp.StartApplicationHelper.IsReady = False System.Windows.Forms.Application.DoEvents() Loop MyWpfApp.StartApplicationHelper.DispatchEvent("OpenWin1")

In questo modo posso definire un InteropFormMethod per aprire le finestre WPF da VB6 attraverso la Interop WinForm.

Questa soluzione sembra funzionare ma ho un problema con un particolare caso d'uso in cui l'applicazione wpf viene prima arrestata (shutdown) e poi riavviata (start); il messaggio di errore visualizato è: "Cannot create more than one System.Windows.Application instance in the same AppDomain".

Sto provando a modificare la mia classe helper per gestire questa situazione ma ancora non ho trovato una soluzione. Vorrei "ripulire" l'AppDomain per poter riavviare l'applicazione Wpf senza problemi.

Come posso fare? Avete qualche idea? Grazie.

enricovirg Profilo | Newbie

Stiamo reingegnerizzando un' applicazione da VB6 a WPF, "passo a passo" ovvero mantenedo l'operatività su VB6 ma "aggiungendo" gradualmente i nuovi forms sviluppati in WPF.
Un bel casino... alla fine abbiam deciso di utilizzare i Socket TCP.

Riassumendo:
- L' applicazione WPF ha un form che fa da "listener" (attende le richieste TCP su una particolare porta) e che viene avviato e messo in "background" sul pc dell' utente, come notification icon nella system tray.
- Il form "listener" si occupa di ricevere le richieste, interpretarle ed eseguire delle azioni, ovvero aprire i forms relativi...
- Il programma VB6 invia le richieste TCP al socket tramite specifiche funzioni (WSKSOCK.bas, la si trova in rete...).

Non è stato di facile "implementazione" ma ora gira senza grossi problemi...


lukepet Profilo | Junior Member

Praticamente ho la stessa vostra esigenza, applicativo VB6 esteso con delle nuove funzionalità sviluppate in WPF...ed effetivamente è un bel casino. Mi sto scervellando in questi giorni per cercare di individuare la soluzione più idonea per gestire il dialogo tra VB6 e WPF. Come prima prova avevo esposto un servizio WCF hostato sulla WPF application per gestire la notifica di apertura delle finestre via VB6; ma la soluzione, pur funzionando, non mi ha convinto a pieno.

Adesso sto cercando di evitare l'utilizzo del servizio WCF appoggiandomi all'Interop Form Library...per il momento la cosa sembra funzionare ma ci sono alcuni nodi critici che devo ancora risolvere.

Visto che anche voi state affrontando lo stesso problema volevo chiederti un paio di cose:
- Il metodo da voi utilizzato permette di gestire eventuali notifiche da WPF verso VB6? Per esempio, se io da VB6 apro un finestra WPF e poi da tale finestra dovessi richiamare una procedura o un altro trattamento VB6, posso farlo? Se si, in che modo avete gestito questa cosa?
- Come si comporta a livello di performance il listener che si occupa dell'apertura delle finestre? Con la soluzione WCF che io avevo precedentemente implementato ho notato dei tempi di attesa un pò troppo elevati quando avviavo la prima finestra WPF e questo mi ha fatto un po' storcere il naso.
- In base alle vostre esperienze sapete consigliarmi qualche risorsa di riferimento che è possibile consultare?

Vi ringrazio in anticipo per ogni informazione fornita.

enricovirg Profilo | Newbie

- Il metodo da voi utilizzato permette di gestire eventuali notifiche da WPF verso VB6? Per esempio, se io da VB6 apro un finestra WPF e poi da tale finestra dovessi richiamare una procedura o un altro trattamento VB6, posso farlo? Se si, in che modo avete gestito questa cosa?

Non ne abbiamo l'esigenza, attualmente il sistema è "unidirezionale", VB6-->WPF

- Come si comporta a livello di performance il listener che si occupa dell'apertura delle finestre? Con la soluzione WCF che io avevo precedentemente implementato ho notato dei tempi di attesa un pò troppo elevati quando avviavo la prima finestra WPF e questo mi ha fatto un po' storcere il naso.

A livello di performance, nessuna differenza tra l'apertura di un form in WPF rispetto ad uno di VB6 (anzi, a noi pare pure più "fluido"...)

- In base alle vostre esperienze sapete consigliarmi qualche risorsa di riferimento che è possibile consultare?

Oddio, e chi si ricorda ? Cmq al tempo ci eravamo documentati leggendo posts in rete, forums, guide sui Socket, etc.etc.
Ripeto però, l'implementazione non è stata proprio una "passeggiata"...

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5