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

  • 質問

  • どうもお世話になります。

    現在VS2003で開発を行っておりますが

    セットアッププロジェクトを作成しアプリを配布しようと思っております。

    その際に、Exeとファイルをインストール時にインストールマシンにコピー

    するのですが、ファイルをユーザが削除すると

    exeの起動時に勝手にインストーラが起動し

    ユーザが削除したファイルを復元してしまうのです。

    ファイルはユーザが任意で削除できるようにはしたいのですが

    その際にインストーラが起動しないようにすることは可能なのでしょうか?

    またこのような現象は通常起こりうることなのでしょうか?

    よろしくお願いいたします。

    2006年6月29日 5:33

回答

  • 次のようにすれば、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);
      }

     

    必要に応じて、アンインストールやロールバックのカスタム動作も指定してください。

    2006年6月30日 15:33

すべての返信

  • とっちゃんです。

     tomonori_tomo さんからの引用

    するのですが、ファイルをユーザが削除すると

    exeの起動時に勝手にインストーラが起動し

    ユーザが削除したファイルを復元してしまうのです。

    この仕組みは、WindowsInstaller の特徴の一つである自動修復機能です。VSセットアップではファイルごとにコンポーネントを用意しますので、どのファイルであっても、削除したりすると必ず自動的に修復が行なわれます。

    どういう用途で、削除したいのかはわかりませんが、カスタムインストールのような仕組みがほしいというのであれば、VSセットアップでは実現できないので、WiX もしくは、InstallShield などの本格的なインストーラ作成ツールを導入することをお勧めします。

     

    2006年6月29日 6:44
  • とっちゃん

    さっそくのご返信ありがとうございますm(__)m

    そうなのですか、ウィンドウズインストーラではやはりダメなのですね

    わかりました、ありがとうございます。

    とりあえず初回起動時にプログラムから自動生成するようにしました。

    2006年6月29日 9:05
  • 次のようにすれば、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);
      }

     

    必要に応じて、アンインストールやロールバックのカスタム動作も指定してください。

    2006年6月30日 15:33