C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

インストーラMicrosoft SetupProject_2 /ぽんすけ (18/09/03(Mon) 12:50) #88483
Re[1]: インストーラMicrosoft SetupProject_2 /とっちゃん (18/09/03(Mon) 13:26) #88484
  └ Re[2]: インストーラMicrosoft SetupProject_2 /ぽんすけ (18/09/03(Mon) 14:12) #88485
    └ Re[3]: インストーラMicrosoft SetupProject_2 /とっちゃん (18/09/03(Mon) 15:32) #88486
      └ Re[4]: インストーラMicrosoft SetupProject_2 /ぽんすけ (18/09/03(Mon) 15:52) #88487
        └ Re[5]: インストーラMicrosoft SetupProject_2 /ぽんすけ (18/09/07(Fri) 23:40) #88565
          └ Re[6]: インストーラMicrosoft SetupProject_2 /ぽんすけ (18/09/08(Sat) 11:55) #88566
            └ Re[7]: インストーラMicrosoft SetupProject_2 /ぽんすけ (18/09/08(Sat) 13:43) #88570 解決済み


親記事 / ▼[ 88484 ]
■88483 / 親階層)  インストーラMicrosoft SetupProject_2
□投稿者/ ぽんすけ (23回)-(2018/09/03(Mon) 12:50:15)

分類:[インストーラ全般] 

お世話になっております。

Visual Studio2017においてC#でSetup projectを使ってインストーラを作成しております。
またまた問題が出てきましたので、ご相談させていただきます。

アンインストール時にカスタム動作を入れたいため、System.Configuration.Install.Installer
クラスを継承したクラスを作成し、アンインストール時に、確認ダイアログを表示しようと
思いました。

確認ダイアログで「はい」が選択された場合、アンインストール実行し、
「いいえ」が選択された場合はロールバックさせたいと思い、以下のような
コードを入れてみました。


public override void Uninstall(System.Collections.IDictionary savedState)
{
DialogResult result = MessageBox.Show("アンインストールしますか?",
"確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation,
MessageBoxDefaultButton.Button2);

if (result == DialogResult.Yes)
{
base.Uninstall(savedState);
}
else if (result == DialogResult.No)
{
base.Rollback(savedState);
}

System.Windows.Forms.MessageBox.Show("Uninstall");
}


ところが「いいえ」選択時には、ロールバックされませんでした。
よくよく確認しますと、ここに来た時点ではすでにアンインストールが
終わってしまっているということに気づきました。
このような確認ダイアログを出したい場合、自作でアンインストール処理
を作成する以外、方法はありませんでしょうか。
すみませんが、ご教示ください。




[ □ Tree ] 返信 編集キー/

▲[ 88483 ] / ▼[ 88485 ]
■88484 / 1階層)  Re[1]: インストーラMicrosoft SetupProject_2
□投稿者/ とっちゃん (516回)-(2018/09/03(Mon) 13:26:09)
No88483 (ぽんすけ さん) に返信
> アンインストール時にカスタム動作を入れたいため、System.Configuration.Install.Installer
> クラスを継承したクラスを作成し、アンインストール時に、確認ダイアログを表示しようと
> 思いました。
>
> 確認ダイアログで「はい」が選択された場合、アンインストール実行し、
> 「いいえ」が選択された場合はロールバックさせたいと思い、以下のような
> コードを入れてみました。
>

カスタム動作が呼び出される段階ですでにアンインストール処理が「開始」しています。
Installerクラスを呼び出す仕組みの都合もあるのですが、このクラスのメソッド(イベントハンドラ)には
戻り値を渡して、挙動を制御するという仕組みが用意されていません。

それはともかくとして、実現したいことは「アンインストールしますか?」の表示確認ですか?

実現できたとして。。。呼び出し方によっては本当のアンインストール前と、アンインストール中の
2回表示される場合がありますがそれでも問題ないのでしょうか?
#OSや呼び出し方によっては自分が追加した分しか表示されない


[ 親 88483 / □ Tree ] 返信 編集キー/

▲[ 88484 ] / ▼[ 88486 ]
■88485 / 2階層)  Re[2]: インストーラMicrosoft SetupProject_2
□投稿者/ ぽんすけ (24回)-(2018/09/03(Mon) 14:12:22)
No88484 (とっちゃん さん) に返信

返信ありがとうございます。

>
> それはともかくとして、実現したいことは「アンインストールしますか?」の表示確認ですか?

「アンインストールしますか?」の表示確認を行い、
「はい」の場合は実行させ、「いいえ」の場合はアンインストールを
キャンセルさせたいと思っています。

>
> 実現できたとして。。。呼び出し方によっては本当のアンインストール前と、アンインストール中の
> 2回表示される場合がありますがそれでも問題ないのでしょうか?
> #OSや呼び出し方によっては自分が追加した分しか表示されない
>
できれば、1回のみ(自分が追加した分)の表示のほうが良いと
考えております。

[ 親 88483 / □ Tree ] 返信 編集キー/

▲[ 88485 ] / ▼[ 88487 ]
■88486 / 3階層)  Re[3]: インストーラMicrosoft SetupProject_2
□投稿者/ とっちゃん (517回)-(2018/09/03(Mon) 15:32:03)
No88485 (ぽんすけ さん) に返信
>>それはともかくとして、実現したいことは「アンインストールしますか?」の表示確認ですか?
>
> 「アンインストールしますか?」の表示確認を行い、
> 「はい」の場合は実行させ、「いいえ」の場合はアンインストールを
> キャンセルさせたいと思っています。
>
Installer クラスで実現するのは多分無理だと思います。

Installerクラスの Uninstall を呼び出さなかった場合も、アンインストールをキャンセルすることはないと思うので多分だめなんじゃないかなぁ?

と思います。
もしかしたら、Uninstall で何もしないということで行けるかもしれません。
多分だめだと思いますけど。。。

>>
>>実現できたとして。。。呼び出し方によっては本当のアンインストール前と、アンインストール中の
>>2回表示される場合がありますがそれでも問題ないのでしょうか?
>>#OSや呼び出し方によっては自分が追加した分しか表示されない
> >
> できれば、1回のみ(自分が追加した分)の表示のほうが良いと
> 考えております。
>

こちらは、かなりの難易度かつ、必ず出てしまうのが1つあります。

「アプリケーションの追加と削除でアンインストールを押された場合」

です。

まず、これをどうするか?(自分の1回のみが実現不可能な条件がせいりつしている)を考えたうえで
再度検討することをお勧めします。

そのうえで、これとは別に。。。ということであれば、

インストール後に
msiexec /i アプリの.msi
として、メンテナンスモードから削除を選択した場合
msiexec /x アプリの.msi
として、そのままアンインストールを始めた場合
の2つも動かして検討してみてください。

実際に自分の目で見て確認した上で、どうするのがいいかを検討するとよいと思います。

「アンインストールしますか?」というメッセージの表示については。

[ 親 88483 / □ Tree ] 返信 編集キー/

▲[ 88486 ] / ▼[ 88565 ]
■88487 / 4階層)  Re[4]: インストーラMicrosoft SetupProject_2
□投稿者/ ぽんすけ (25回)-(2018/09/03(Mon) 15:52:24)
No88486 (とっちゃん さん) に返信

お忙しいところ、ご教示ありがとうございます。
頂いた内容をもとに検討してみます。

[ 親 88483 / □ Tree ] 返信 編集キー/

▲[ 88487 ] / ▼[ 88566 ]
■88565 / 5階層)  Re[5]: インストーラMicrosoft SetupProject_2
□投稿者/ ぽんすけ (26回)-(2018/09/07(Fri) 23:40:03)
No88487 (ぽんすけ さん) に返信
> ■No88486 (とっちゃん さん) に返信
>
> お忙しいところ、ご教示ありがとうございます。
> 頂いた内容をもとに検討してみます。

上記の件につきましては、まだ保留中ですが、別件の質問がございます。
インストーラ起動時に、インストール先を聞かれて、c:\Program Files\・・・・・以外の
フォルダも指定できますが、ここで指定したフォルダのパスは
アプリのほうで参照できますでしょうか。あるいはカスタム動作で参照できますでしょうか。
すみませんが、ご教示ください。


[ 親 88483 / □ Tree ] 返信 編集キー/

▲[ 88565 ] / ▼[ 88570 ]
■88566 / 6階層)  Re[6]: インストーラMicrosoft SetupProject_2
□投稿者/ ぽんすけ (28回)-(2018/09/08(Sat) 11:55:58)
No88565 (ぽんすけ さん) に返信
> ■No88487 (ぽんすけ さん) に返信
>>■No88486 (とっちゃん さん) に返信
>>
>>お忙しいところ、ご教示ありがとうございます。
>>頂いた内容をもとに検討してみます。
>
> 上記の件につきましては、まだ保留中ですが、別件の質問がございます。
> インストーラ起動時に、インストール先を聞かれて、c:\Program Files\・・・・・以外の
> フォルダも指定できますが、ここで指定したフォルダのパスは
> アプリのほうで参照できますでしょうか。あるいはカスタム動作で参照できますでしょうか。
> すみませんが、ご教示ください。
>
カスタム動作System.Configuration.Install.Installer継承クラスのInstall()で参照する
ことはできました。これをアプリ側へ受け渡すことは可能なのでしょうか
[ 親 88483 / □ Tree ] 返信 編集キー/

▲[ 88566 ] / 返信無し
■88570 / 7階層)  Re[7]: インストーラMicrosoft SetupProject_2
□投稿者/ ぽんすけ (29回)-(2018/09/08(Sat) 13:43:26)
No88566 (ぽんすけ さん) に返信
> ■No88565 (ぽんすけ さん) に返信
>>■No88487 (ぽんすけ さん) に返信
> >>■No88486 (とっちゃん さん) に返信
> >>
> >>お忙しいところ、ご教示ありがとうございます。
> >>頂いた内容をもとに検討してみます。
>>
>>上記の件につきましては、まだ保留中ですが、別件の質問がございます。
>>インストーラ起動時に、インストール先を聞かれて、c:\Program Files\・・・・・以外の
>>フォルダも指定できますが、ここで指定したフォルダのパスは
>>アプリのほうで参照できますでしょうか。あるいはカスタム動作で参照できますでしょうか。
>>すみませんが、ご教示ください。
>>
> カスタム動作System.Configuration.Install.Installer継承クラスのInstall()で参照する
> ことはできました。これをアプリ側へ受け渡すことは可能なのでしょうか
解決済み
[ 親 88483 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -