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

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

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

セットアッププロジェクトにて、ファイル更新条件

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■102424 / inTopicNo.1)  セットアッププロジェクトにて、ファイル更新条件
  
□投稿者/ kiku (376回)-(2023/09/27(Wed) 15:31:26)

分類:[.NET 全般] 

VisualStudio2022、
セットアッププロジェクトにて
インストーラを作ろうとしています。

インストール先には下記ファイルがあるとします。
WindowsFormsApp1.exe(exeファイル)
xml(フォルダ)
  設定ファイル.xml(ファイル)

1.1回目インストールに成功した。
2.上記、設定ファイルの中身をaからbに変更した。
3.2回目インストーラを作成
  ・アプリのバージョン変更
  ・インストーラのバージョン変更
  ・設定ファイルの中身をaからcに変更した。
4.2回目インストールに成功した。
  ※1回目のアンインストールを実行せずに、2回目のインストーラを起動
5.設定ファイルの中身は、bになっていた

2回目のインストール直後に、
設定ファイルの中身をcにすることはできますでしょうか?

設定ファイルのプロパティをいくつか変更してみたのですが
思うように動作してくれないのです。
アドバイス頂けますと幸いです。

引用返信 編集キー/
■102425 / inTopicNo.2)  Re[1]: セットアッププロジェクトにて、ファイル更新条件
□投稿者/ kiku (377回)-(2023/09/27(Wed) 17:27:54)
No102424 (kiku さん) に返信
> 2回目のインストール直後に、
> 設定ファイルの中身をcにすることはできますでしょうか?

その後、設定ファイルを変更した場合、
アンインストールしても設定ファイルが残ることがわかりました。

なら、アンインストール後に、バッチファイルなどを起動し、
そのバッチファイルにて、インストール先のフォルダを
すべて削除してしまえば、やりたいことが実現できるのではないかと思い
実験したところうまく行きました。

具体的な方法としては、
セットアッププロジェクトのカスタム動作という機能があり、
このアンインストール項目に、所定のバッチファイルを指定して
あげれば、アンインストール成功後に、このバッチファイルが起動します。

これでうまく行ったのですが、
新たに問題が発生しました。

上記削除バッチを動作させるために
インストール先のフォルダのフルパスが必要になります。
このパスを取得する方法がないか?という質問になります。

現在、別途インストール先を固定するために
DefaultLocationに、[WindowsVolume]\[ProductName]を設定しています。
※画面からは変更できないように、変更画面を削除しています。

この設定により十中八九、c:\[ProductName]がインストール先になるのですが、
稀に、d:\[ProductName]がインストール先になることがあるのではないかと
思っています。

何かアイデアはないでしょうか?
アドバイス頂けますと幸いです。

引用返信 編集キー/
■102426 / inTopicNo.3)  Re[1]: セットアッププロジェクトにて、ファイル更新条件
□投稿者/ とっちゃん (793回)-(2023/09/27(Wed) 20:31:30)
> ■No102424 (kiku さん) に返信
>>2回目のインストール直後に、
>>設定ファイルの中身をcにすることはできますでしょうか?
>
設定ファイルをbの状態にというのは、どこにある設定ファイルを
いつどのタイミングで誰がどうやって変更したのでしょうか?

インストーラがファイルを更新する条件は以下リファレンスをまずはお読みください。

・ファイルのバージョン管理ルール
https://learn.microsoft.com/ja-jp/windows/win32/msi/file-versioning-rules?WT.mc_id=DT-MVP-32182


> その後、設定ファイルを変更した場合、
> アンインストールしても設定ファイルが残ることがわかりました。
>
その残ってしまう設定ファイルはインストールしたファイルですか?
それとも、インストール後にアプリで作成するファイルですか?

アプリで作成するのであればインストーラが知らないファイルになりますので
インストーラで削除するように設定する必要があります。
(VSIではファイルを削除する設定がないので、別途設定が必要)。

RemoveFile Table に追加すれば対応できますが自分でスクリプトを書くか(wirunsql.vbsを利用)
Orcaなどで、あらかじめ差分データを作っておいてそれをMsiMergeなどを利用して
ビルド後イベントなどで合成することになります。

・RemoveFile テーブル
https://learn.microsoft.com/ja-jp/windows/win32/msi/removefile-table?WT.mc_id=DT-MVP-32182


> なら、アンインストール後に、バッチファイルなどを起動し、
> そのバッチファイルにて、インストール先のフォルダを
> すべて削除してしまえば、やりたいことが実現できるのではないかと思い
> 実験したところうまく行きました。
>
これもありですが、WindowsInstaller的には最後手段ですね。
(どうしても設定レベルでは制御できない特殊な部分で利用する方法)


> 具体的な方法としては、
> セットアッププロジェクトのカスタム動作という機能があり、
> このアンインストール項目に、所定のバッチファイルを指定して
> あげれば、アンインストール成功後に、このバッチファイルが起動します。
>
> これでうまく行ったのですが、
> 新たに問題が発生しました。
>
> 上記削除バッチを動作させるために
> インストール先のフォルダのフルパスが必要になります。
> このパスを取得する方法がないか?という質問になります。
>
カスタム動作で呼び出すプログラムにパラメータを渡すなどが一般的です。
呼び出すバッチファイルを選択してプロパティを表示し Arguments に
インストールパス(「"[TARGETDIR]\"」と「」の内側をセット)すれば
行けると思います。
旨く行ってるかどうかは、バッチファイルの行頭で
ECHO %1
PAUSE
などとやって、確認するとよいでしょう。

引用返信 編集キー/
■102428 / inTopicNo.4)  Re[2]: セットアッププロジェクトにて、ファイル更新条件
□投稿者/ kiku (378回)-(2023/09/28(Thu) 09:07:12)
No102426 (とっちゃん さん) に返信
>>■No102424 (kiku さん) に返信
> >>2回目のインストール直後に、
> >>設定ファイルの中身をcにすることはできますでしょうか?
>>
> 設定ファイルをbの状態にというのは、どこにある設定ファイルを
> いつどのタイミングで誰がどうやって変更したのでしょうか?
インストーラで設定ファイルを配置し、
アプリから設定ファイルの内容を変更する想定です。

> インストーラがファイルを更新する条件は以下リファレンスをまずはお読みください。
>
> ・ファイルのバージョン管理ルール
> https://learn.microsoft.com/ja-jp/windows/win32/msi/file-versioning-rules?WT.mc_id=DT-MVP-32182
ありがとうございます。
更新日時で見るんですね。
デフォルトの動作ということで理解しました。

> アプリで作成するのであればインストーラが知らないファイルになりますので
> インストーラで削除するように設定する必要があります。
> (VSIではファイルを削除する設定がないので、別途設定が必要)。
>
> RemoveFile Table に追加すれば対応できますが自分でスクリプトを書くか(wirunsql.vbsを利用)
> Orcaなどで、あらかじめ差分データを作っておいてそれをMsiMergeなどを利用して
> ビルド後イベントなどで合成することになります。
>
> ・RemoveFile テーブル
> https://learn.microsoft.com/ja-jp/windows/win32/msi/removefile-table?WT.mc_id=DT-MVP-32182
この件は、あとでゆっくり調査させてください。

>>なら、アンインストール後に、バッチファイルなどを起動し、
>>そのバッチファイルにて、インストール先のフォルダを
>>すべて削除してしまえば、やりたいことが実現できるのではないかと思い
>>実験したところうまく行きました。
>>
> これもありですが、WindowsInstaller的には最後手段ですね。
> (どうしても設定レベルでは制御できない特殊な部分で利用する方法)
今はこの方法が簡単そうなので
定石ではないのだと思いますが、
こちらの方法で検討したいと思います。

> カスタム動作で呼び出すプログラムにパラメータを渡すなどが一般的です。
> 呼び出すバッチファイルを選択してプロパティを表示し Arguments に
> インストールパス(「"[TARGETDIR]\"」と「」の内側をセット)すれば
> 行けると思います。
> 旨く行ってるかどうかは、バッチファイルの行頭で
> ECHO %1
> PAUSE
> などとやって、確認するとよいでしょう。

上記をヒントにいろいろ実験してみました。
CustomActionプロパティのSourcePathが編集できなかったため、
いろいろ検索したところ、下記の方法で動作することを確認しました。

起動スクリプトをaaa.vbsに変更。
CustomActionプロパティのCustonActionDataに[TARGETDIR]を設定。
aaa.vbs内にて、下記を実施することでパスを取得できました。
val = Session.Property("CustomActionData")

ご回答頂きありがとうございました。
アドバイス頂いたことをヒントに解決することができました。
大変助かりました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ