Pergunta

A resposta, provavelmente, envolve uma desinstalação personalizada ação, mas parece que um grande oversite e algo que todas as aplicações gostaria, então eu pensei que eu ia ver se não é algo fácil que eu estou faltando.

Eu tenho um par de projectos de criar no Visual Studio 2008 usando C#, Winform projetos.Usa-clique em-depois de instalar e usar um um projeto de instalação.Ambos permitem que você deixe o aplicativo em execução quando você desinstalar.No Windows 7 você não receber um aviso, mas tem a opção de deixá-lo em execução de qualquer maneira...no XP nem sequer um aviso.

Me chamar de louco, mas o pensamento de todos os meus arquivos de programa a ser removido, e o meu app ainda está em execução, não soa como um bom design em tudo.Memórias do GPFs vêm à mente, ou a forma .NET usa atrasar o carregamento de DLLs, também pode ser um problema quando a DLL precisa ser carregado, e está desaparecido.

Assim é que existe uma maneira fácil de não permitir que se desinstalar o aplicativo ainda está em execução?

Eu estou usando C#, mas eu estou usando o VB.NET Única Instância da classe para certificar-se de meu aplicativo é executado apenas uma vez, então talvez algo que leva a vantagem de que, como oposição à criação de um mutex para verificar?

Também meu aplicativo permite apenas "por usuário" instala, não de "todos os usuários", então eu não deveria ter de me preocupar com o aplicativo em execução em outra sessão (se for, está OK para continuar em execução, porque ele deve ser de 100% a sua própria cópia).

Editar: Desde que eu não estou achando nada de mais, eu tentei o mutex idéia e ele não está funcionando.Aqui é o meu código:

No app, eu tenho este para criar o nome de exclusão mútua e manter-se vivo enquanto o aplicativo executando:

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

        SingleInstanceApplication.Run(TabForm, NewInstanceHandler);

        GC.KeepAlive(m);

No desinstalar ação que este ciclo até que a saída (uma vez que parece não ser fácil para fornecer uma opção de cancelar):

            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 é definido em desinstalar ação, quase como se ele está sendo executado em uma sessão diferente ou algo assim.Eu ainda não tentei adicionar Global\ to nome do mutex, mas que não funcionaria bem para o meu aplicativo de qualquer maneira, porque eu faço por usuário instala-se, então, uma instalação deve ser capaz de manter em execução em outra sessão, mesmo se um é desinstalado.

Foi útil?

Solução

Resposta curta é não há nenhuma maneira fácil de fazer isso porque ele não é algo que a Microsoft quer que você faça.

A minha resposta fez acabar usando um mutex, uma vez que eu tenho o código correto ele parece funcionar bem.

O app que eu faço:

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

O SingleInstanceApplication.Linha de execução é o que executa o app, eu estou usando o VB.NET quadro.

Na desinstalação personalizada de ação que eu faço:

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");
}    

No começo eu estava usando m.ReleaseMutex() em vez de m.Fechar() que eu descobri que estava lançando uma exceção, porque eu não tinha o mutex.De perto era o que eu deveria ter sido usando, apenas para se certificar de que a minha cópia foi fechado antes de eu verifiquei novamente (caso contrário createNew nunca foi verdade, se não era verdade a primeira vez).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top