トップ回答者
インストーラで作成したファイルを削除すると実行時にインストーラが起動し再生成されてしまう。

質問
-
どうもお世話になります。
現在VS2003で開発を行っておりますが
セットアッププロジェクトを作成しアプリを配布しようと思っております。
その際に、Exeとファイルをインストール時にインストールマシンにコピー
するのですが、ファイルをユーザが削除すると
exeの起動時に勝手にインストーラが起動し
ユーザが削除したファイルを復元してしまうのです。
ファイルはユーザが任意で削除できるようにはしたいのですが
その際にインストーラが起動しないようにすることは可能なのでしょうか?
またこのような現象は通常起こりうることなのでしょうか?
よろしくお願いいたします。
回答
-
次のようにすれば、WindowsInstallerだけでも、実現可能です。
該当のアプリケーションに、新しい項目 > インストーラクラス でインストーラクラスを追加し、Install(IDictionary savedState) メソッドをオーバーライドして、そのメソッド中でWindowsInstallerに関知してほしくないファイルを生成します。あとは、表示 > エディタ > カスタム動作 で、インストールにカスタム動作を追加し、インストーラクラスが含まれているアセンブリを指定します。
たとえば、次のようなコードでは、インストール時に original.txt を copied.txt にコピーしているので、アプリケーションフォルダには、original.txt と copied.txt が生成されますが、WindowsInstallerにより修復されるのは、original.txt のみです。
public override void Install(IDictionary savedState)
{
string original = "original.txt"; /*インストーラプロジェクトに含める */
string copied = "copied.txt";
string folderName = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
System.IO.File.Copy(System.IO.Path.Combine(folderName, original), System.IO.Path.Combine(folderName, copied), true);
base.Install(savedState);
}
必要に応じて、アンインストールやロールバックのカスタム動作も指定してください。
すべての返信
-
とっちゃんです。
tomonori_tomo さんからの引用 するのですが、ファイルをユーザが削除すると
exeの起動時に勝手にインストーラが起動し
ユーザが削除したファイルを復元してしまうのです。
この仕組みは、WindowsInstaller の特徴の一つである自動修復機能です。VSセットアップではファイルごとにコンポーネントを用意しますので、どのファイルであっても、削除したりすると必ず自動的に修復が行なわれます。
どういう用途で、削除したいのかはわかりませんが、カスタムインストールのような仕組みがほしいというのであれば、VSセットアップでは実現できないので、WiX もしくは、InstallShield などの本格的なインストーラ作成ツールを導入することをお勧めします。
-
次のようにすれば、WindowsInstallerだけでも、実現可能です。
該当のアプリケーションに、新しい項目 > インストーラクラス でインストーラクラスを追加し、Install(IDictionary savedState) メソッドをオーバーライドして、そのメソッド中でWindowsInstallerに関知してほしくないファイルを生成します。あとは、表示 > エディタ > カスタム動作 で、インストールにカスタム動作を追加し、インストーラクラスが含まれているアセンブリを指定します。
たとえば、次のようなコードでは、インストール時に original.txt を copied.txt にコピーしているので、アプリケーションフォルダには、original.txt と copied.txt が生成されますが、WindowsInstallerにより修復されるのは、original.txt のみです。
public override void Install(IDictionary savedState)
{
string original = "original.txt"; /*インストーラプロジェクトに含める */
string copied = "copied.txt";
string folderName = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
System.IO.File.Copy(System.IO.Path.Combine(folderName, original), System.IO.Path.Combine(folderName, copied), true);
base.Install(savedState);
}
必要に応じて、アンインストールやロールバックのカスタム動作も指定してください。