Sostituire i file .dll mentre l'applicazione è in esecuzione?


18

Ho diversi server di gioco che utilizzano un determinato file DLL per l'esecuzione. A volte ho bisogno di aggiornare i server di gioco, ma non voglio interrompere i giochi che sono già in esecuzione.

C'è un modo per sostituire il file .dll (è bloccato da Windows) in modo che le istanze successive dei server di gioco che utilizzano quel file aprano la nuova versione e quelle vecchie continuino a utilizzare la vecchia versione di quel .dll fino al loro riavvio ?

È sicuro sbloccare semplicemente il file usando uno di quegli strumenti che lo fanno e lo sostituiscono?


Forse non è il tuo gioco. Tuttavia Chrome si aggiorna senza interrompere il processo. Sfortunatamente, questa è specifica per l'applicazione. (Vai a %LocalAppData%\Google\Chrome\Applicatione dovresti vedere cartelle come quelle 26.0.1410.64che memorizzano DLL di diverse versioni)
Alvin Wong

A seconda del software in questione, potrebbe essere possibile installare ed eseguire due o più istanze distinte (in posizioni diverse). Inefficiente, ma forse praticabile.
Harry Johnston,

Risposte:


23

In realtà, puoi farlo e di solito funziona senza problemi (anche se non sempre)

Quello che fai è rinominare il file senza spostarlo e spostare il nuovo file su di esso. Ciò manterrà gli handle nel file validi e funzionanti in modo che le istanze preesistenti possano ancora accedere correttamente al file e le nuove istanze (o nuovi handle) andranno al nuovo file.

Ovviamente, se un programma riapre lo stesso file dll e si aspetta che rimanga esattamente lo stesso (ad esempio, se ci sono risorse da caricare dalla dll e che i riferimenti a queste risorse vengono estratti dal codice in esecuzione quando viene caricata la dll ), questo causerà problemi ma questa non è sicuramente la norma.


11

No. Anche se una DLL può essere interamente mappata nella memoria fisica mentre l'applicazione è in esecuzione, non esiste alcuna garanzia. Parti di DLL (e persino eseguibili) possono essere mappate nella RAM mentre altri bit rimangono sul disco e possono essere lette in un secondo momento.

La modifica del file su disco mentre Windows ne ha bit bit mappati nella RAM non finirebbe bene. Windows lo blocca per una buona ragione.

Modifica: ho bisogno di chiarire qualcosa poiché alcune persone sembrano intenzionate a incolpare Windows per ciò che è in realtà un problema di progettazione dell'applicazione , non un problema di progettazione del sistema operativo.

È possibile aggiornare le DLL utilizzate dalle applicazioni in Windows senza terminare il processo, ma l'applicazione deve essere stata scritta in modo tale da poter segnalare di scaricare l'assembly, attendere il completamento dell'aggiornamento, quindi ricaricare la DLL. Questo non ha nulla a che fare con il sistema operativo in esecuzione. È un problema di progettazione dell'applicazione.

Modifica: vedere anche la risposta di Stephane per una possibile soluzione che potrebbe funzionare, a seconda di come l'applicazione specifica risponde alla modifica della DLL. Penso che meriti un voto.


Esiste un modo per spostare quel file in una posizione temporanea in modo che possa essere eliminato in un secondo momento, mentre ne inserisce uno nuovo nella sua posizione precedente (in modo che i server che iniziano dopo utilizzeranno la nuova dll)? O l'handle del file è collegato al percorso del file?

Dipende interamente da come viene scritta l'applicazione / come usa le DLL. Dai un'occhiata alla risposta di Greg Askew. Se l'handle del file è aperto non c'è molto che puoi fare al riguardo. Puoi forzatamente chiudere l'handle del file ma quasi sicuramente andrai in crash almeno sulla tua app, se non sull'intero sistema operativo.
Ryan Ries il

Allora, qual è questa "buona ragione"? Finora la tua risposta non contiene un motivo convincente per cui Microsoft non offre la possibilità di hot-swap.
Konrad Rudolph,

2

No, non dovresti armeggiare con gli handle di file esistenti.

Se è possibile assumere il controllo del caricamento dell'assieme e specificare che viene aperto con FileShare.Delete, dovrebbe essere possibile rinominarlo. I processi esistenti continueranno a fare riferimento all'assembly rinominato.

/programming/7147577/programmatical-rename-open-file-on-windows .


2
Nella mia esperienza, nella maggior parte dei casi (beh, più della metà delle volte, in ogni caso) è possibile rinominare (ma non eliminare) una DLL senza armeggiare con l'applicazione.
Harry Johnston,

@HarryJohnston: Sì, sembra che posso rinominare il .dll anche se è in uso. Immagino che lo farò d'ora in poi.

1

No, purtroppo non è possibile.

Siamo spiacenti, per essere precisi a meno che non ci sia un'associazione tardiva, il che significa che l'app utilizza quella dll quando esegue una parte del codice in quella dll, ma non è ancora affidabile.


1

Puoi vedere come funziona il processo ospitato su asp.net e sviluppare qualcosa di simile.

Prende l'intera applicazione Web e la sposta in una posizione temporanea da cui l'applicazione viene effettivamente caricata. Quindi lascia un processo per monitorare le modifiche nella cartella originale, quando viene rilevato, avvia una nuova istanza dell'applicazione in una nuova posizione temporanea e inizia a reindirizzare nuove richieste a quell'app. La vecchia app viene quindi abbattuta al termine delle richieste in sospeso.

(Nitpicking, sì, è una visione semplificata delle cose, nella maggior parte dei casi IIS mette in coda le richieste fino a quando la nuova app è in grado di subentrare)



0

Il programma di installazione di NSIS ha un'opzione come Sposta a temperatura al riavvio della macchina, il sistema operativo contrassegna alcuni file per spostarsi in una posizione diversa all'avvio successivo, al successivo avvio della macchina questi file contrassegnati si spostano automaticamente nella nuova posizione selezionata in precedenza. Una piccola ricerca su questo ti renderà felice in questo senso.


È possibile fornire una risposta completa nella risposta anziché dire all'OP di cercare una soluzione. Non sarebbe qui per chiedere se avesse già trovato una soluzione. Grazie.
John aka hot2use,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.