Domanda

La risposta implica probabilmente un'azione di disinstallazione personalizzata, ma sembra un così importante sovrascritto e qualcosa che ogni applicazione vorrebbe, quindi ho pensato di vedere se c'è qualcosa di facile, mi manca.

Ho un paio di progetti creare in Visual Studio 2008 utilizzando i progetti C #, Winform. Uno utilizza il clic una volta installato e si utilizza un progetto di installazione. Entrambi consentono di lasciare l'applicazione in esecuzione quando si disinstalla. Su Windows 7 si ottiene un avviso, ma ha la possibilità di lasciarlo correre comunque ... su XP nemmeno un avviso.

Chiamami pazzo, ma il pensiero di tutti i miei file di programma vengono rimossi e la mia app ancora lasciata in esecuzione, non suona affatto un buon design. I ricordi di GPF vengono in mente, o il modo in cui .NET utilizza il caricamento del ritardo per DLL, potrebbe anche essere un problema quando la DLL deve essere caricata e non è andata.

Quindi c'è un modo semplice per non consentire la disinstallazione se la tua app è ancora in esecuzione?

Sto usando c # ma sto usando la classe di istanza singola vb.net per assicurarti che la mia app funzioni solo una volta, quindi forse qualcosa che ne sfrutta questo rispetto a creare un mutex da controllare? Inoltre la mia app consente solo "per utente" installazioni, non "tutti gli utenti", quindi non dovrei preoccuparmi della mia app in esecuzione in un'altra sessione (se lo è, è OK rimanere in esecuzione perché dovrebbe essere 100% la propria copia).

Modifica: Poiché non sto trovando nient'altro, ho provato l'idea di mutex e non funziona. Ecco il mio codice:

Nell'app ho questo per creare il nome di nome e mantenere vivo mentre l'app in esecuzione:

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

        SingleInstanceApplication.Run(TabForm, NewInstanceHandler);

        GC.KeepAlive(m);
.

Nell'azione di disinstallazione ho questo da loop fino a quando non usciranno (dal momento che non sembra essere facile da fornire un'opzione Annulla):

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

CreatoNew non è mai impostato nell'azione di disinstallazione, quasi come è in esecuzione sotto una sessione diversa o qualcosa del genere. Non ho provato ad aggiungere Global \ al nome del mutex, ma non funzionerebbe comunque per la mia app perché faccio installando l'utente, quindi un'installazione dovrebbe essere in grado di continuare a funzionare in un'altra sessione anche se uno è disinstallato. < / P >.

È stato utile?

Soluzione

La risposta breve è che non c'è un modo semplice per farlo perché non è qualcosa che Microsoft vuole che tu faccia.

La mia risposta ha finito con un mutex, una volta ottenuto il codice corretto sembra funzionare bene.

Nell'app che faccio:

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

La linea singleinstanceapplication.run è ciò che esegue la tua app, sto usando VB.NET Framework.

Nell'azione di disinstallazione personalizzata Io:

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

All'inizio stavo usando m.releasemutex () invece di m.close () che ho scoperto stava lanciando un'eccezione perché non possedere il mutex.Chiudi quello che avrei dovuto usare, solo per assicurarmi che la mia copia sia stata chiusa prima di controllare di nuovo (altrimenti il createNew non è mai stato vero, se non fosse vero la prima volta).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top