¿Reemplazar archivos .dll mientras se ejecuta la aplicación?

18

Tengo varios servidores de juegos que usan un determinado archivo .dll para ejecutarse. A veces necesito actualizar los servidores del juego, pero no quiero interrumpir los juegos que ya se están ejecutando.

¿Hay alguna manera de reemplazar el archivo .dll (está bloqueado por Windows) para que las siguientes instancias de los servidores de juegos que usan ese archivo abran la nueva versión, y las antiguas sigan usando la versión anterior de ese .dll hasta que se reinicien ?

¿Es seguro desbloquear el archivo usando una de esas herramientas que lo hacen y reemplazarlo?


fuente
Quizás no sea tu juego. Sin embargo, Chrome se actualiza sin interrumpir su proceso. Desafortunadamente, esto es específico de la aplicación. (Vaya %LocalAppData%\Google\Chrome\Applicationy debería ver carpetas como las 26.0.1410.64que almacenan archivos DLL de diferentes versiones)
Alvin Wong
Dependiendo del software en cuestión, podría ser posible instalar y ejecutar dos o más instancias distintas (en diferentes ubicaciones). Ineficiente, pero tal vez viable.
Harry Johnston

Respuestas:

23

En realidad, puedes y generalmente funciona sin ningún problema (aunque no siempre)

Lo que debe hacer es cambiar el nombre del archivo sin moverlo y mover el nuevo archivo sobre él. Eso mantendrá los identificadores del archivo válidos y funcionando para que las instancias preexistentes aún puedan acceder al archivo correctamente y las nuevas instancias (o nuevos identificadores) irán al nuevo archivo.

Obviamente, si un programa vuelve a abrir el mismo archivo dll y espera que permanezca exactamente igual (por ejemplo, si hay recursos para cargar desde el dll y esas referencias se extraen del código que se ejecuta cuando se carga el dll ), esto causará problemas, pero definitivamente no es la norma.

Stephane
fuente
11

No. A pesar de que una DLL se puede asignar por completo a la memoria física mientras se ejecuta la aplicación, definitivamente no hay garantía de eso. Porciones de archivos DLL (e incluso ejecutables) pueden asignarse a la RAM mientras otros bits permanecen en el disco y pueden leerse más adelante.

Cambiar el archivo en el disco mientras Windows tiene partes de él mapeadas en RAM no terminaría bien. Windows lo bloquea por una buena razón.

Editar: Necesito aclarar algo, ya que algunas personas parecen tener la intención de culpar a Windows de lo que en realidad es un problema de diseño de la aplicación , no un problema de diseño del sistema operativo.

Puede actualizar las DLL que las aplicaciones usan en Windows sin finalizar el proceso, pero la aplicación debe haberse escrito de tal manera que se pueda indicar que descargue el ensamblado, espere a que finalice la actualización y luego vuelva a cargar la DLL. Esto no tiene nada que ver con el sistema operativo que está ejecutando. Es un problema de diseño de aplicaciones.

Editar: también vea la respuesta de Stephane para una posible solución que podría funcionar, dependiendo de cómo responda su aplicación específica a su cambio de DLL. Creo que merece un voto a favor.

Ryan Ries
fuente
¿Hay alguna forma de mover ese archivo a una ubicación temporal para que pueda eliminarse más tarde, mientras coloca uno nuevo en su ubicación anterior (para que los servidores que se inicien después de eso usen el nuevo dll)? ¿O está el identificador de archivo vinculado a la ubicación del archivo?
Eso depende completamente de cómo se escribe la aplicación / cómo usa las DLL. Echa un vistazo a la respuesta de Greg Askew. Si el identificador de archivo está abierto, no hay mucho que pueda hacer al respecto. Puede cerrar por la fuerza el identificador de archivos, pero seguramente bloqueará al menos su aplicación, si no todo el sistema operativo.
Ryan Ries
Entonces, ¿cuál es esta "buena razón"? Hasta ahora, su respuesta no contiene una razón convincente por la cual Microsoft no ofrece la capacidad de intercambio en caliente.
Konrad Rudolph
2

No, no debe jugar con los identificadores de archivos existentes.

Si puede tomar el control de la carga del ensamblaje y especificar que se abre con FileShare.Delete, entonces debería ser posible cambiarle el nombre. Los procesos existentes continuarán haciendo referencia al ensamblado renombrado.

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

Greg Askew
fuente
2
En mi experiencia, en la mayoría de los casos (bueno, más de la mitad del tiempo, en cualquier caso) puede cambiar el nombre (pero no eliminar) una DLL sin modificar la aplicación.
Harry Johnston
@HarryJohnston: Sí, parece que puedo cambiar el nombre del archivo .dll incluso si está en uso. Supongo que lo haré de ahora en adelante.
1

No, desafortunadamente no es posible.

Lo sentimos, para ser exactos, a menos que haya un enlace tardío, lo que significa que la aplicación usa ese dll cuando ejecuta alguna parte del código en ese dll, pero aún no es confiable.

Danila Ladner
fuente
1

Podrías ver cómo funciona el proceso alojado asp.net y desarrollar algo similar.

Toma toda la aplicación web y la mueve a una ubicación temporal desde la cual se carga la aplicación. Luego deja un proceso para monitorear los cambios en la carpeta original, cuando se detecta, hace girar una nueva instancia de la aplicación en una nueva ubicación temporal y comienza a redirigir nuevas solicitudes a esa aplicación. La aplicación anterior se desarma una vez que finalizan las solicitudes pendientes.

(Nitpicking, sí, es una vista simplificada de las cosas, en la mayoría de los casos, IIS pone en cola las solicitudes hasta que la nueva aplicación pueda hacerse cargo)

Thomas James
fuente
0

NSIS Installer tiene una opción como Mover a temperatura al reiniciar la máquina, el sistema operativo marca algunos archivos para moverlos a una ubicación diferente en el próximo arranque, en el siguiente arranque de la máquina estos archivos marcados se mueven automáticamente a la nueva ubicación que seleccionó anteriormente. Una pequeña búsqueda en esto te hará feliz a este respecto.

Shashank Kandhawe
fuente
Puede proporcionar una respuesta completa en su respuesta en lugar de decirle al OP que busque una solución. No estaría aquí preguntando si ya había encontrado una solución. Gracias.
John también conocido como hot2use el