none
Setup プロジェクトにおける旧バージョンのアンインストールについて RRS feed

  • 質問

  • こんにちは。

    VS 2008 Team system Developer Editionで開発をしています。
    作成した複数の実行ファイルなどをSetup プロジェクトで作成しています。

    この時
    ・RemovePreviousVersions  をTrueに
    ・Version は、新しいビルドを作成するときに変更
    ・ProductCodeを変更

    としているのですが、旧バージョンのアンインストールをうまくやってくれないんです。

    ちなみに、インストール・およびアンインストール時にそれぞれ「サービスへの登録」「サービスの削除」というカスタム動作を追加しており、そこでサービスに登録/削除するための実行ファイルを作っていてそれを実行させているのですが、どうやらアップデートをする際にはここがうまく動いてくれていないようです。

    アプリケーションの追加と削除からアンインストールを行うと、サービスなどもきれいに削除してくれますので、このカスタム動作で実行している内容自体は問題ないようなのですが・・・。

    アップデート時にアンインストール用のカスタム動作を実行させるには、何か特殊な事を行う必要があるのでしょうか?

    お手数をおかけしますが、ご存じの方がいらっしゃいましたらご教授いただけますでしょうか・・・
    よろしくお願いいたします。

    2010年7月27日 8:08

回答

  • 呼ばれたので、出てきましたw<うそです。単に帰宅時間との兼ね合いですw

    現在問題になってるのは

    「旧バージョンのアンインストール用のカスタム動作がバージョンアップ時に動作しない。」

    ということであってますか?であれば、アップデート方式がそういう方式なので、動かないのが仕様です。という回答になります。

    WindowsInstallerの更新のパターンにはいくつかあるのですが、VSセットアップが採用している方式は、「バージョンアップインストール処理中に不要なものだけ削除する」という方式になっています。なぜこの方式にしてるのか?は知りませんが、VSセットアップはもともと、UIとアンインストール機能があるちょっと高機能なバッチインストールと大差ないので、サービスをインストールするというような難しいことは想定の範囲内にありません。

    なので、ちょっと小難しい処理は勝手にやってね。とカスタム動作(.NET で作れるようにかなりトリッキーな邪悪なコードと呼ばれる仕組み)を提供しています。

    とりあえず。。。サービスの登録をカスタム動作で行っている場合、アップグレードはやめたほうがいいです。もし、アップグレードに対応したいのなら、WindowsInstallerの持つサービスの登録と解除の仕組みを利用してください。

    としか言いようがないんですよ。なんでできるようにしなかったのか?と思うのですが、たぶんVSセットアップを作った当初(VS2002の開発初期のころでしょう)は、.NET でサービス作るような奴はVSセットアップなんてしょぼいもの使わないから問題ないんじゃね?という判断でも下されたのでしょう。

    それくらい使えないものなので、あきらめてください。どうしてもそういうのがやりたい。。。ということであれば、

    InstallShield(VS2010ならIS-LEでもよい)を使うか、WiXを使うかで検討することをお勧めします。頑張ってもいいんですが、サービスの停止を行えないので、リブートしちゃうとかいろいろあるんで。。。労力かかる割には報われない(そしておそらく要求を満たせない)と思うんで。。。

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク どらちん 2010年7月28日 3:10
    2010年7月27日 14:11
  • http://vsug.jp/tabid/63/forumid/42/postid/10264/scope/posts/Default.aspx

    を見ると、「更新は必ず ProductCode が変更されていて、なおかつバージョンが上がっているという条件が前提条件として課されています。」と記載されているのですが、これは誤りなのでしょうか?

     リンク先のレスを拝見いたしました。
    そのレスを書いたとっちゃんさんはこのフォータムでもお見かけする方で
    わたしもよくレスを見て勉強させていただいています。
    そのレスの内容が正しいのかもしれませんが
    セットアッププロジェクト関連の不具合でうまくいかないということもあります。

    実際、カスタム動作についてではありませんが
    セットアップファイル(.msi)が正しく作成されない場合はありました。
    Orca で修正できるならそれもいいですが
    毎度となるとけっこう面倒かと。

    前回リンク先の RemovePreviousVersions プロパティー注意書きもしかり、
    セットアッププロジェクトの振る舞いがはっきり解らないような状況では
    セットアッププロジェクトの設定に依存しない
    「インストール」「アンインストール」の仕組みを
    作ったほうがよいかもしれません。

    実は私、上記URLを見て修正版のインストーラを作成したんです。

    ちなみに、ProductCodeを変更しないと、「別のバージョンがインストールされているためアンインストールしてからインストールし直してください」と出てしまいます(もちろん「RemoveRreviousVersions」はTrueになっています)。


    カスタム動作の部分は、通常のインストール/アンインストールでは問題なく動作しているのです。
    インストーラの動作を見ていると、旧バージョンのアンインストール、という作業そのものをやっていないように見えるんですよね・・・・。

    教えていただいたURLはもしかしてこれかな?という記載がおっしゃるところにあったのですが・・・
    Orcaで手動修正するしかなさそうな感じがしてます・・・




    そうですね。>「別のバージョンが…」とでてしまう。
    その回避策としては、「アンインストール」と「インストール」
    を続けて行うスクリプトを作成したりします。
    「アンインストール」は msiexec.exe の /X オプションでできます。
    /X なら「プログラムの追加と削除」でできるアンインストールを同じとおもわれます。
    • 編集済み anningo 2010年7月27日 12:26 文言追加 そうですね。 → そうですね。>「別のバージョンが…」とでてしまう。
    • 回答としてマーク どらちん 2010年7月28日 3:10
    2010年7月27日 12:23

すべての返信

  • ProductCode を変更しないでおくとうまくいきませんか?

    ProductCode を変えると新プロダクトなので
    アンインストールすべき旧バージョンは無いという判断されるべきです。

    逆に新旧バージョンを1PC内に共存させたい場合は
    ProductCode を変えるべきだと思います。
    2010年7月27日 9:48
  • ああ、でも RemovePreviousVersions を true にしているんだから
    前バージョンがアンインストールされるんじゃないかってことですね。

    下記リンク先にある赤い二重線で囲まれた
    「注意:RemovePreviousVersionsプロパティをTrueにしても前のバージョンがアンインストールされないケースが幾つかあります。」
    の条件には該当しないでしょうか?

    セットアッププロジェクトによるアップデート
    http://dobon.net/vb/dotnet/deployment/upgrades.html

    該当しないなら、アンインストールのカスタム動作がうまくいかないということなのかなあ…。

    追記:もしくは、アンインスールのカスタム動作は
    アンインストールの最後に行われるためうまくいかないとか。

    • 編集済み anningo 2010年7月27日 10:34 追記を横棒で削除。ただのアンインストールがうまくいくならこれはないですね。
    2010年7月27日 10:24
  • anningoさん

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

    http://vsug.jp/tabid/63/forumid/42/postid/10264/scope/posts/Default.aspx

    を見ると、「更新は必ず ProductCode が変更されていて、なおかつバージョンが上がっているという条件が前提条件として課されています。」と記載されているのですが、これは誤りなのでしょうか?

    実は私、上記URLを見て修正版のインストーラを作成したんです。

    ちなみに、ProductCodeを変更しないと、「別のバージョンがインストールされているためアンインストールしてからインストールし直してください」と出てしまいます(もちろん「RemoveRreviousVersions」はTrueになっています)。

    カスタム動作の部分は、通常のインストール/アンインストールでは問題なく動作しているのです。
    インストーラの動作を見ていると、旧バージョンのアンインストール、という作業そのものをやっていないように見えるんですよね・・・・。

    教えていただいたURLはもしかしてこれかな?という記載がおっしゃるところにあったのですが・・・
    Orcaで手動修正するしかなさそうな感じがしてます・・・

    2010年7月27日 11:19
  • http://vsug.jp/tabid/63/forumid/42/postid/10264/scope/posts/Default.aspx

    を見ると、「更新は必ず ProductCode が変更されていて、なおかつバージョンが上がっているという条件が前提条件として課されています。」と記載されているのですが、これは誤りなのでしょうか?

     リンク先のレスを拝見いたしました。
    そのレスを書いたとっちゃんさんはこのフォータムでもお見かけする方で
    わたしもよくレスを見て勉強させていただいています。
    そのレスの内容が正しいのかもしれませんが
    セットアッププロジェクト関連の不具合でうまくいかないということもあります。

    実際、カスタム動作についてではありませんが
    セットアップファイル(.msi)が正しく作成されない場合はありました。
    Orca で修正できるならそれもいいですが
    毎度となるとけっこう面倒かと。

    前回リンク先の RemovePreviousVersions プロパティー注意書きもしかり、
    セットアッププロジェクトの振る舞いがはっきり解らないような状況では
    セットアッププロジェクトの設定に依存しない
    「インストール」「アンインストール」の仕組みを
    作ったほうがよいかもしれません。

    実は私、上記URLを見て修正版のインストーラを作成したんです。

    ちなみに、ProductCodeを変更しないと、「別のバージョンがインストールされているためアンインストールしてからインストールし直してください」と出てしまいます(もちろん「RemoveRreviousVersions」はTrueになっています)。


    カスタム動作の部分は、通常のインストール/アンインストールでは問題なく動作しているのです。
    インストーラの動作を見ていると、旧バージョンのアンインストール、という作業そのものをやっていないように見えるんですよね・・・・。

    教えていただいたURLはもしかしてこれかな?という記載がおっしゃるところにあったのですが・・・
    Orcaで手動修正するしかなさそうな感じがしてます・・・




    そうですね。>「別のバージョンが…」とでてしまう。
    その回避策としては、「アンインストール」と「インストール」
    を続けて行うスクリプトを作成したりします。
    「アンインストール」は msiexec.exe の /X オプションでできます。
    /X なら「プログラムの追加と削除」でできるアンインストールを同じとおもわれます。
    • 編集済み anningo 2010年7月27日 12:26 文言追加 そうですね。 → そうですね。>「別のバージョンが…」とでてしまう。
    • 回答としてマーク どらちん 2010年7月28日 3:10
    2010年7月27日 12:23
  • 呼ばれたので、出てきましたw<うそです。単に帰宅時間との兼ね合いですw

    現在問題になってるのは

    「旧バージョンのアンインストール用のカスタム動作がバージョンアップ時に動作しない。」

    ということであってますか?であれば、アップデート方式がそういう方式なので、動かないのが仕様です。という回答になります。

    WindowsInstallerの更新のパターンにはいくつかあるのですが、VSセットアップが採用している方式は、「バージョンアップインストール処理中に不要なものだけ削除する」という方式になっています。なぜこの方式にしてるのか?は知りませんが、VSセットアップはもともと、UIとアンインストール機能があるちょっと高機能なバッチインストールと大差ないので、サービスをインストールするというような難しいことは想定の範囲内にありません。

    なので、ちょっと小難しい処理は勝手にやってね。とカスタム動作(.NET で作れるようにかなりトリッキーな邪悪なコードと呼ばれる仕組み)を提供しています。

    とりあえず。。。サービスの登録をカスタム動作で行っている場合、アップグレードはやめたほうがいいです。もし、アップグレードに対応したいのなら、WindowsInstallerの持つサービスの登録と解除の仕組みを利用してください。

    としか言いようがないんですよ。なんでできるようにしなかったのか?と思うのですが、たぶんVSセットアップを作った当初(VS2002の開発初期のころでしょう)は、.NET でサービス作るような奴はVSセットアップなんてしょぼいもの使わないから問題ないんじゃね?という判断でも下されたのでしょう。

    それくらい使えないものなので、あきらめてください。どうしてもそういうのがやりたい。。。ということであれば、

    InstallShield(VS2010ならIS-LEでもよい)を使うか、WiXを使うかで検討することをお勧めします。頑張ってもいいんですが、サービスの停止を行えないので、リブートしちゃうとかいろいろあるんで。。。労力かかる割には報われない(そしておそらく要求を満たせない)と思うんで。。。

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク どらちん 2010年7月28日 3:10
    2010年7月27日 14:11
  • anningoさん、とっちゃんさん、ご返答ありがとうございます^^

    なるほど・・・アンインストール→インストール用のスクリプトを作成するのが一番早いような気がしてきました^^;
    そう言う場合だと、プロダクトIDは変更しない方が楽そうですね☆
    (バージョンをあげる度に変更してしまうと、アンインストール用のスクリプトの部分がバージョンが変わる毎に行を追加するはめになりそうです[笑])

    「WindowsInstallerの持つサービスの登録と解除の仕組み」があることを今まで知りませんでした>_<
    できないんだな~と思って、インストール時にサービスを登録する・アンインストール時にサービスを削除するexeをそれぞれ作っておき、カスタム動作で実行させていました・・・

    私もちょっと調べてみましたけど、相当使えなそうな感じですね・・・

    http://www.civil-design.net/free/coach/dev/wi/orca_major.html

    とかにメジャーバージョンアップ時のmsiファイルの編集方法などが掲載されているようですが、毎回これをやるのはおっくぅですねぇ・・・^^;

    おとなしくアップグレード用のスクリプトを作ろうと思います。
    お忙しい中、ありがとうございました^^

    本件、解決とさせていただきます。

    2010年7月28日 3:10