Come aggiornare la dipendenza durante il runtime nella mia applicazione .NET?

3

Ho un'applicazione client-server. A volte il server viene aggiornato che richiede l'aggiornamento di alcune DLL nel client (le DLL sono le dipendenze dell'eseguibile principale). Per ora, dobbiamo chiudere il client, distribuire manualmente le DLL e quindi riavviare il client. Questo è un po 'un inconveniente perché il client è un'applicazione automatica, quindi normalmente non ha bisogno di alcun intervento da parte dell'utente.

È possibile che ciò avvenga automaticamente senza riavvio o intervento dell'utente? Come, il client dovrebbe scaricare l'ultima DLL e sostituire quella attuale?

    
posta Louis Rhys 04.10.2012 - 03:54
fonte

3 risposte

5

Questo è un ordinario modello sandbox (quello che viene utilizzato con plugins / addin ). Invece di chiamare direttamente le librerie, le carichi in un diverso AppDomain . In questo modo è possibile aggiornare le librerie corrispondenti mentre l'applicazione è ancora in esecuzione.

Se desideri automatizzare il processo, l'applicazione client può monitorare la directory con quelle librerie e caricarne di nuove nell'appDomain in modalità sandbox quando sono disponibili.

Nota che:

  • L'uso di sandbox non è facile come non usarlo e devi essere pronto ad avere alcuni problemi. I due che avevo erano che non ero in grado di mettere gli elementi dell'interfaccia utente nelle librerie sandboxed e che cache ha smesso di funzionare quando si utilizza sandbox .

  • Se ci sono molti scambi tra la sandbox e l'applicazione stessa, potresti vedere diminuire le prestazioni della tua applicazione.

  • Con una sandbox, non sarà possibile scaricare, aggiornare e caricare la versione aggiornata della libreria se l'applicazione sta eseguendo nello stesso momento il codice da questa libreria. Non è solo possibile, e non ha senso.

    Questo è probabilmente anche il motivo per cui i browser come Chrome e Firefox devono ancora riavviarsi per completare gli aggiornamenti.

    Se questo è il tuo caso, puoi cercare un modo per indicare al codice dalla libreria che deve fermarsi, poiché la libreria verrà scaricata.

  • L'architettura generale della tua applicazione sarebbe sicuramente più complessa. Ne vale la pena? Non potresti programmare un aggiornamento in background, cioè ogni notte, se è disponibile una nuova versione, l'applicazione si fermerà completamente, aggiornerà se stessa (tramite un eseguibile di aggiornamento), e quindi verrà riavviata dal programma di aggiornamento?

risposta data 04.10.2012 - 04:52
fonte
1

Sì, è possibile in molti modi diversi. Il modo più semplice è chiamato Distribuzione ClickOnce

Questo è un meccanismo di distribuzione molto conveniente per le applicazioni client intelligenti create per .NET Framework. Puoi ottenere informazioni dettagliate su come impostare automaticamente gli aggiornamenti all'avvio dei tuoi clienti. Ecco un buon riferimento su come amministrare il processo - Amministrazione delle distribuzioni ClickOnce .

    
risposta data 04.10.2012 - 04:21
fonte
0

Dovresti considerare l'implementazione della tua applicazione MEF (Managed Extensibility Framework) . Con MEF puoi facilmente caricare le tue dipendenze DLL da un Catalogo delle directory e scrivi il codice per aggiornare il catalogo quando il contenuto della directory cambia . Tutto questo può essere fatto al volo senza che l'app debba essere fermata e riavviata, se eseguita correttamente.

Tuttavia non è una soluzione priva di codice. Devi scrivere la funzionalità MEF nell'app principale che carica il catalogo e le DLL dovrebbero essere scritte per ospitare MEF.

    
risposta data 04.10.2012 - 06:45
fonte

Leggi altre domande sui tag