1

答えはおそらくカスタムアンインストールアクションを含むでしょうが、それはそのような主要なオーバーサイトであり、すべてのアプリケーションが望むもののように思われるので、私が見逃している簡単なものがあるかどうかを確認したいと思いました。

Visual Studio 2008でC#、Winformプロジェクトを使用していくつかのプロジェクトを作成しています。1つはクリックワンスインストールを使用し、もう1つはセットアッププロジェクトを使用します。どちらも、アンインストール時にアプリケーションを実行したままにすることができます。Windows 7では警告が表示されますが、とにかく実行したままにするオプションがあります...XPでは警告すらありません。

私をクレイジーと呼んでください。しかし、私のプログラムファイルがすべて削除され、アプリがまだ実行されているという考えは、まったく良いデザインのようには思えません。GPFのメモリーが思い浮かびます。または、.NETがDLLの遅延ロードを使用する方法も、DLLをロードする必要があり、なくなったときに問題になる可能性があります。

それで、アプリがまだ実行されている場合にアンインストールを許可しない簡単な方法はありますか?

私はC#を使用していますが、VB.NETシングルインスタンスクラスを使用してアプリが1回だけ実行されるようにしているので、チェックするミューテックスを作成するのではなく、それを利用するものがあるでしょうか。

また、私のアプリは「すべてのユーザー」ではなく「ユーザーごと」のインストールのみを許可しているため、別のセッションで実行されているアプリについて心配する必要はありません(そうであれば、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は、別のセッションなどで実行されているように、アンインストールアクションで設定されることはありません。ミューテックス名にGlobal\を追加しようとはしていませんが、ユーザーごとにインストールするため、アプリではうまく機能しません。そのため、アンインストールしても、あるインストールを別のセッションで実行し続けることができます。

4

1 に答える 1

0

簡単な答えは、これを行う簡単な方法はありません。Microsoft が望んでいることではないからです。

私の答えはミューテックスを使用することになりました。コードが正しくなると、正常に動作するようです。

アプリで私は:

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() を使用していましたが、ミューテックスを所有していなかったため、例外がスローされていました。Close は、もう一度チェックする前にコピーが閉じられていることを確認するために使用する必要があったものです (そうでなければ、最初に true でなかった場合、createNew は決して true になりませんでした)。

于 2012-05-22T22:00:07.530 に答える