アンインストール前に停止するためにWinFormsアプリが必要です
-
11-12-2019 - |
質問
答えはおそらくカスタムアンインストール行動を含みますが、そのような大きな監督とあらゆるアプリケーションが望むように思われるので、私は簡単に行方不明の何かがあるかどうかがわかりました。
私は、C#、WinFormプロジェクトを使用してVisual Studio 2008でプロジェクトをいくつか作成しています。クリックするとインストールをクリックすると、セットアッププロジェクトを使用します。両方とも、アンインストール時にアプリケーションを実行しておくことができます。 Windows 7では警告を受けますが、とにかく実行しているままにするオプションがあります。XPでさえ警告されていません。
私を狂わせるのではなく、私のプログラムファイルのすべての考えを削除し、まだ私のアプリはまだ残っていますが、まったく良いデザインのように聞こえません。 GPFのメモリが気になるようになります.NETはDLLの遅延ロードを使用している方法でも、DLLをロードする必要があり、消去しました。
あなたのアプリがまだ実行されている場合はアンインストールを許可しない簡単な方法はありますか?
C#を使っていますが、私はvb.netシングルインスタンスクラスを使用して、アプリが一度実行されることを確認してください。 >
私のアプリは、「すべてのユーザー」ではなく「ユーザーごと」のインストールを可能にしますので、私のアプリを別のセッションで実行していることを心配する必要はありません(そうである場合は、実行し続けるのは大丈夫です。それ自身のコピー100%)
編集:他に何か見つからないので、ミューテックスのアイデアを試してみました。これが私のコードです:
アプリでは、名前付きミューテックスを作成し、アプリを実行している間に生き続けるためにこれを持っています:
.
System.Threading.Mutex m = new System.Threading.Mutex(true, "SafeShare");
SingleInstanceApplication.Run(TabForm, NewInstanceHandler);
GC.KeepAlive(m);
アンインストールアクションで、これが終了するまでループするためにループすることがあります(キャンセルオプションを提供するのが簡単ではないので):
.
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はアンインストールアクションに設定されていません。ほとんどの場合、異なるセッションまたは何かの下で実行されているように。私はMutex Nameにグローバル\を追加したことはありませんでしたが、それは私がユーザーごとのインストールを行うので私のアプリにはうまくいかないでしょう。 / P>
解決
ショートアンサーは、マイクロソフトがあなたにやることが望んでいることではないため、これを行う簡単な方法はありません。
私の答えはミューテックスを使って終わったら、コードが正しいと思われるようになったら、それはうまくいくようです。
アプリで私はします:
System.Threading.Mutex m = new System.Threading.Mutex(true, "MyMutexNameHere");
SingleInstanceApplication.Run(TabForm, NewInstanceHandler);
GC.KeepAlive(m);
.
SingleInstanceApplication.run行はあなたのアプリを実行するものです、私はvb.netフレームワークを使用しています。
カスタムアンインストールアクションで実行します。
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");
}
.
最初はM.close()の代わりにM.ReleaseMutex()を使用していました。私がもう一度チェックされる前に私のコピーが閉まっていたことを確認してきたことは、私が使用してきたことでした(そうでなければ、それが初めて真の場合は真実ではなかったならば)。