Pregunta

La respuesta probablemente implica una acción de desinstalación personalizada, pero parece que es un gran sobredimensión y algo que todas las aplicaciones querrían, así que pensé que vería si hay algo fácil que me estoy perdiendo.

Tengo un par de proyectos creamos en Visual Studio 2008 usando C #, WinForm PROYECTOS. Uno usa el clic, una vez instalado, y se usa un proyecto de configuración. Ambos le permiten dejar la aplicación en ejecución cuando desinstale. En Windows 7, obtiene una advertencia, pero tenga la opción de dejarlo ejecutando de todos modos ... en XP, ni siquiera una advertencia.

Llámame loco, pero el pensamiento de todos mis archivos de programas se eliminan, y mi aplicación aún se queda en funcionamiento, no suena como un buen diseño en absoluto. Los recuerdos de GPFs vengan a la mente, o la forma en que Way .NET usa la carga de demora para DLL, también podría ser un problema cuando la DLL debe cargarse, y se ha ido.

Entonces, ¿hay una manera fácil de no permitir una desinstalación si su aplicación sigue funcionando?

Estoy usando C #, pero estoy usando la clase de instancia de VB.NET para asegurarme de que mi aplicación solo se ejecute una vez, ¡tal vez algo que se aproveche de eso, en lugar de crear un mutex para verificar?

También mi aplicación solo permite que la instalación "por usuario", no "todos los usuarios", por lo que no debería tener que preocuparme por mi aplicación en otra sesión (si es, está bien permanecer en funcionamiento porque debería ser 100% su propia copia).

Editar: Ya que no estoy encontrando nada más, he probado la idea mutex y no funciona. Aquí está mi código:

En la aplicación, tengo esto para crear el nombre de MUTEX y mantener con vida mientras la aplicación funciona:

        System.Threading.Mutex m = new System.Threading.Mutex(true, "SafeShare");

        SingleInstanceApplication.Run(TabForm, NewInstanceHandler);

        GC.KeepAlive(m);

En la acción de desinstalación, tengo esto para hacerlo hasta que salgan (ya que no parece ser fácil proporcionar una opción de cancelación):

            while (true)
            {
                bool createdNew;
                System.Threading.Mutex m = new System.Threading.Mutex(true, "SafeShare", out createdNew);
                m.ReleaseMutex();
                if (createdNew)
                    break;
                MessageBox.Show(null,"Close XXX and click OK to continue uninstall.","Uninstall");
            }

CreatedNew nunca se establece en la acción de desinstalación, casi como se está ejecutando bajo una sesión diferente o algo así. No he intentado agregar el nombre global \ al Mutex, pero eso no funcionaría bien para mi aplicación de todos modos porque hago instalaciones por usuario, por lo que una instalación debería poder seguir funcionando en otra sesión, incluso si se desinstala. < / p>

¿Fue útil?

Solución

La respuesta corta es que no hay una manera fácil de hacer esto porque no es algo que Microsoft quiere que hagas.

Mi respuesta terminó usando un mutex, una vez que obtuve el código correcto, parece funcionar bien.

en la aplicación i hago:

System.Threading.Mutex m = new System.Threading.Mutex(true, "MyMutexNameHere");
SingleInstanceApplication.Run(TabForm, NewInstanceHandler);
GC.KeepAlive(m); 

La línea única en la línea es lo que ejecuta su aplicación, estoy usando el marco vb.net.

En la acción de desinstalación personalizada que hago:

while (true)
{
   bool createdNew;
   System.Threading.Mutex m = new System.Threading.Mutex(true, "MyMutexNameHere", out createdNew);
   m.Close();
   if (createdNew)
      break;
   MessageBox.Show(null,"Close XXX and click OK to continue uninstall.","Uninstall");
}    

Al principio estaba usando M.ReleasEmutex () en lugar de M.Close () que descubrí fue lanzar una excepción porque no poseí el Mutex.Cerrar fue lo que debería haber estado usando, solo para asegurarme de que mi copia estuviera cerrada antes de volver a verificar (de lo contrario, CreateNew nunca fue cierto, si no fuera cierto la primera vez).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top