none
Actualizar DLL sin reinicio de Windows RRS feed

  • Pregunta

  • Mi aplicación contiene una DLL para un menú contextual y estoy intentando actualizarla, pero cuando llega el momento de desinstalar la aplicación (desregistrar la DLL) del menú contextual si no reinicio posteriormente no me deja instalar la nueva. ¿Existe alguna forma de actualizarla sin obligar al usuario a reiniciar? Algunas aplicaciones como Winrar o Dropbox lo hacen, puedes desinstalar e instalar la aplicación de nuevo sin reiniciar y el menú contextual sigue funcionando. La DLL la he generado con la librería SharpShell que facilita el proceso.

    La DLL la registro y 'desregistro' con RegAsm.exe

    Gracias

    lunes, 4 de septiembre de 2017 11:32

Respuestas

  • Registrarla y desregistrarla no tiene nada que ver. Lo que hace falta es que no esté en uso. Si el algún programa está usando la DLL en el momento de actualizarla, no se puede sobreescribir. Entonces lo que hace el instalador es copiarla en otro sitio, y meter en el registro de Windows una clave que básicamente significa "cuando arranques, copia este fichero". De esa forma, al arrancar Windows (y antes de que arranque la aplicación) se copia ese fichero que antes no se pdía copiar por estar en uso.

    Por lo tanto, para no tener que hacer un reinicio, cerciórate antes de actualizar de que la DLL no está en uso. Ojo, esto hay que hacerlo bien, por ejemplo, si es una DLL de tipo COM y la usaba un programa de .Net y simplemente has puesto a null la referencia, no basta para que se "descargue" la DLL; es necesario que el programa llame a ReleaseComObject. Y presumo que en otros entornos que no sean .Net pueden pasar cosas parecidas, y que una DLL todavía esté cargada en memoria aunque aparentemente la aplicación haya sido cerrada porque ya no muestra su interfaz de usuario. Así que hay que investigar a fondo qué programa usa la DLL y verificar que la libera de verdad, no solo en apariencia.

    lunes, 4 de septiembre de 2017 12:42
    Moderador

Todas las respuestas

  • Registrarla y desregistrarla no tiene nada que ver. Lo que hace falta es que no esté en uso. Si el algún programa está usando la DLL en el momento de actualizarla, no se puede sobreescribir. Entonces lo que hace el instalador es copiarla en otro sitio, y meter en el registro de Windows una clave que básicamente significa "cuando arranques, copia este fichero". De esa forma, al arrancar Windows (y antes de que arranque la aplicación) se copia ese fichero que antes no se pdía copiar por estar en uso.

    Por lo tanto, para no tener que hacer un reinicio, cerciórate antes de actualizar de que la DLL no está en uso. Ojo, esto hay que hacerlo bien, por ejemplo, si es una DLL de tipo COM y la usaba un programa de .Net y simplemente has puesto a null la referencia, no basta para que se "descargue" la DLL; es necesario que el programa llame a ReleaseComObject. Y presumo que en otros entornos que no sean .Net pueden pasar cosas parecidas, y que una DLL todavía esté cargada en memoria aunque aparentemente la aplicación haya sido cerrada porque ya no muestra su interfaz de usuario. Así que hay que investigar a fondo qué programa usa la DLL y verificar que la libera de verdad, no solo en apariencia.

    lunes, 4 de septiembre de 2017 12:42
    Moderador
  • Registrarla y desregistrarla no tiene nada que ver. Lo que hace falta es que no esté en uso. Si el algún programa está usando la DLL en el momento de actualizarla, no se puede sobreescribir. Entonces lo que hace el instalador es copiarla en otro sitio, y meter en el registro de Windows una clave que básicamente significa "cuando arranques, copia este fichero". De esa forma, al arrancar Windows (y antes de que arranque la aplicación) se copia ese fichero que antes no se pdía copiar por estar en uso.

    Por lo tanto, para no tener que hacer un reinicio, cerciórate antes de actualizar de que la DLL no está en uso. Ojo, esto hay que hacerlo bien, por ejemplo, si es una DLL de tipo COM y la usaba un programa de .Net y simplemente has puesto a null la referencia, no basta para que se "descargue" la DLL; es necesario que el programa llame a ReleaseComObject. Y presumo que en otros entornos que no sean .Net pueden pasar cosas parecidas, y que una DLL todavía esté cargada en memoria aunque aparentemente la aplicación haya sido cerrada porque ya no muestra su interfaz de usuario. Así que hay que investigar a fondo qué programa usa la DLL y verificar que la libera de verdad, no solo en apariencia.

    Gracias por la respuesta , el programa que utiliza la DLL por así decirlo es el explorer de Windows, ya que se trata de una DLL para el menú contextual de Windows. Ese programa como tal no lo puedo cerrar y he probado con el 
    taskkill /IM explorer.exe
    pero no funciona, al no ser un programa normal y corriente no se como quitarlo. 
    lunes, 4 de septiembre de 2017 13:19