none
visual studio2008で作成したEXEの必須ファイルに再インストールについて RRS feed

  • 質問

  • visual studio2008でC#で作成したフォームアプリケーションの挙動について質問させてください。
    このアプリケーションで使用する.iniファイルについてです。以前まではユーザープログラム内部で
    存在をチェックするロジックを入れていてそれが動いていたのですが、いつのまにか.iniファイルが
    存在しない場合vistaでは自動的にインストールされてしまうようになってしまい、このチェックが
    動きません。特に設定をいじった記憶がありません。どのプロパティ?設定?をいじれば元のように
    自動的にインストールを行わなくなるのかを調べているのですがうまく答えが見つかりません。

    どなたかご存知でしたら御教授おねがいします
    2009年12月5日 12:13

すべての返信

  • 質問の内容が、YOS-1さんにしか理解できない表現ばかりです。
    • EXEの必須ファイルとは
    • アプリケーションで使用する.iniファイルとは
    • 自動的にインストールされてしまうとは
    • 再インストールとは
    この辺りを他の人にもわかる表現をしないと、回答できないと思います。
    2009年12月5日 13:08
  • わかりにくい表現ですいません。

    >EXEの必須ファイルとは
    書き方が悪かったのでこの表現は取り消します
    >アプリケーションで使用する.iniファイルとは
    INIファイルはプログラムが独自で使用する値を定義した.iniファイルです
    >自動的にインストールされてしまうとは
    手順としては
    ①インストーラで.iniファイルとEXEをインストールする
    ②.iniを手動で削除する
    ③EXEファイルを起動する
      従来の動き:.iniファイルがない旨をメッセージ表示する(作成したコードが動く)
      現在の動き:EXE本体が実行される前にインストーラが起動して.iniファイルを自動的にインストールする
    (先ほどの表現で再インストールと表現していたところ)その後でEXEが実行されるため.iniファイルがない旨
    をメッセージ表示しない

    主旨はこの現在の動きを、従来の動き(プログラムで作成した.iniファイルがないという旨のメッセージを表示する)
    に戻したいのです

    2009年12月5日 15:45
  • インストーラはどのように作成したのでしょうか?
    .iniファイルはどこに置かれるのでしょうか?(Vistaという記述が気になりました)

    > ①インストーラで.iniファイルとEXEをインストールする
    インストーラ起動前は.iniファイルは存在しないですか? 起動後は存在しますか?

    > ②.iniを手動で削除する
    削除に成功していますか? 実は失敗していて見直すと残っていたりしませんか?

    > ③EXEファイルを起動する
    >  従来の動き:.iniファイルがない旨をメッセージ表示する(作成したコードが動く)
    >  現在の動き:EXE本体が実行される前にインストーラが起動して.iniファイルを自動的にインストールする
    「インストーラが起動して」というのは、インストーラの画面が表示されるのですか?
    # アドバタイズインストールがらみ? ClickOnceのほうはわかりません(--;

    従来 / 現在の基準がわかりませんでした。両者に環境の違いがあったりしませんか? 従来は違う方法でインストーラを作っていたとか、従来はXPだったとか。
    2009年12月5日 16:07
  • >インストーラはどのように作成したのでしょうか?
    visual studio のプロジェクトで.msiとしてビルドしています

    >.iniファイルはどこに置かれるのでしょうか?(Vistaという記述が気になりました)

    アプリケーションと同じフォルダです(program files\アプリケーションフォルダ\xxx.ini)

    >インストーラ起動前は.iniファイルは存在しないですか? 起動後は存在しますか?
    存在しません、インストール後は存在します
    > ②.iniを手動で削除する
    削除に成功していますか? 実は失敗していて見直すと残っていたりしませんか?

    それは何度も確認しましたが削除されています

    >「インストーラが起動して」というのは、インストーラの画面が表示されるのですか?
    ># アドバタイズインストールがらみ? ClickOnceのほうはわかりません(--;
    インストールシールド?の画面が出てインストール直後のiniファイルが作成されます
    >従来 / 現在の基準がわかりませんでした。両者に環境の違いがあったりしませんか? 従来は違う方法でインストーラを作っていたとか、従来はXPだったとか

    XPでもvistaでも確認しましたが以前のものはチェックが走ります。現在のものはXPではチェックが走る(以前の動き)のですが
    vistaでのみ同現象が起きてしまいます。msiインストーラにvista固有の設定でもあるのでしょうか?
    2009年12月6日 6:40
  • 補足です
    .msi作成方法は従来と同じでvisuial studio 2008で作成しています

    2009年12月6日 6:42
  • >.iniファイルはどこに置かれるのでしょうか?(Vistaという記述が気になりました)

    アプリケーションと同じフォルダです(program files\アプリケーションフォルダ\xxx.ini)
    以前のものが同じ挙動をしないのがちょっとわかりませんが。
    Windows Vista のファイルおよびレジストリの仮想化に関する一般的な問題 などにも書かれていますが、
    Windows Vistaではアプリケーションからの%programfiles%配下への書き込みは%userprofile%\AppData\Local\VirtualStoreへリダイレクトされます。
    %programfiles%側の.iniファイルを消したつもりになっていても、VirtualStore側にファイルが残っていて読み出せてしまっているのかもしれません。

    これに関してはアプリケーションから%programfiles%配下へファイル書き込みをしない仕様に変更すべきです。
    2009年12月6日 6:58
  • MSIの作成時に、そのiniファイルをVITAL指定すると、Windowsが気を利かせて復元してくれますが、
    そういう話でしょうか。

    jzkey
    2009年12月7日 10:18
  • >MSIの作成時に、そのiniファイルをVITAL指定すると、Windowsが気を利かせて復元してくれますが
    vistaだけ復元してくれるということでしょうか?XPで復元されたことは一度もないです
    2009年12月8日 0:03
  • >MSIの作成時に、そのiniファイルをVITAL指定すると、Windowsが気を利かせて復元してくれますが、
    >そういう話でしょうか。
    vistaだけ復元されるのですが、XPでは無効な値なのでしょうか?(XPで復元されたことは一度もないです)
    2009年12月8日 0:07
  • >これに関してはアプリケーションから%programfiles%配下へファイル書き込みをしない仕様に変更すべきです。

    これも試してみました、システムドライブ:\アプリケーションフォルダにインストールするようにしたのですが、最初は
    うまくいっているように見えたのですが、何回かやってるうちに起動時に"~の設定をしています"ダイアログがでて
    復元されたことがありました。この方法も完全ではないようです。
    2009年12月8日 0:13
  • インストーラー絡みは興味があるので少し試してみました。



    Visual Studio 2008 Pro SP1 /XP SP3

    上記環境で簡単な C# のWindows Forms アプリケーションを作成
    次に Setup プロジェクトを作成し、アプリケーションフォルダに exe ファイルと ini ファイルを追加
    この時点で、ini ファイルの Vital プロパティは True になっています。
    ビルドして msi を生成し、Vista Business マシーンにインストールしました。

    この時点で、プログラムは c:\\program files\xxxx\xxxx\  にインストールされています。

    そして ini ファイル を削除して起動してみましたが、インストーラーの復元処理は走りませんでした。



    ちなみに

    Visual Studio 2008 Pro SP1 /Vista Business

    でも同様の手順で msi を作り、Vista Business マシーンにインストールしましたが、
    こちらも上記同様 インストーラーの復元処理は実行されませんでした。


    試した感じでは、特に Vista マシーンだからどうのということはないように思われます。
    Setup プロジェクトで何か特別なことをされておられるのでしょうか?何とも判りません ><
    2009年12月8日 9:05
    モデレータ
  • 自動修復関係かな?


    おそらくひらぽんさんの試した方法はEXEをエクスプローラ等で直接実行したのではないでしょうか?
    この場合、自動修復のトリガーがないまま起動しますので、修復が走ることはありません。

    自動修復は、インストーラで作成したショートカットまたは、COMの登録情報(OLEサーバー等を含む)や、拡張子関連づけで起動した場合に動きます。

    これらの手段で起動した場合は、自動修復チェックが働き、必要があればファイルの修復などが行われます(インストール元によってはメディアが要求される)。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年12月8日 10:46
  • > おそらくひらぽんさんの試した方法はEXEをエクスプローラ等で直接実行したのではないでしょうか?

    実は仰るとおり最初エクスプローラから叩いていたんですが、
    途中からやっぱ気になって

    1. Vista でインストーラを作ってみる
    2. ショートカットをデスクトップに用意してみる。

    でやってみたんですよね。でも復元処理(自動修復?)は走りませんでした。(^ω^;
    2009年12月8日 11:20
    モデレータ
  • Vista での動作が正しく、
    また、自動修復を動作させない方法もわかりません。
    (動作させない方法があったとしても、他のアプリやらで問題があるかも。)

     ↓参考サイト(掲示板)

    Windows Installerの自己修復機能について
    http://dobon.net/vb/bbs/log2/458.html
    http://dobon.net/ DOBON.NET トップページ)

    インストーラーを変更してよいなら↓の方法があるようです。(試していません。)

    自己修復機能を抑制する方法
    http://dobon.net/vb/bbs/log3-36/22223.html
    http://dobon.net/ DOBON.NET トップページ)

    ↓↓↓↓↓↓↓ここらへんの話がよくわからなかったのですが、問題解決にはあまり影響無さそうかな。。 

    以前まではユーザープログラム内部で存在をチェックするロジックを入れていてそれが動いていたのですが、いつのまにか.iniファイルが存在しない場合vistaでは自動的にインストールされてしまうようになってしまい、このチェックが動きません。
    インストーラーは同じなのに、XP→Vista で動作が違う?  
    .msi作成方法は従来と同じでvisuial studio 2008で作成しています
    インストーラーも変えたということでしょうか? 
    • 編集済み anningo 2009年12月9日 2:07 余分な改行削除
    2009年12月9日 2:04
  • よくわからん時は試してみる。。。ということで作ってみました。
    サンプルプロジェクト

    VS2008SP1環境でC#のフォームアプリ+セットアッププロジェクトです。
    単純にアプリのフォルダに INI ファイルが存在するか?を起動時と任意のタイミングでチェックできるようにしたものです。
    ショートカットはインストーラでデスクトップに作成しています。

    で、実際にインストールして試してみたところ、ショートカットから動かせば想定通り自動修復が発動しました。
    もちろん、起動時チェックの時点でファイルがないということはありませんでした。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年12月9日 3:00
  • >ショートカットはインストーラでデスクトップに作成しています。

    なるほど!ここがポイントだったんですね!
    インストール後に作ったショートカットで自動修復が働かなかったのも納得です。
    2009年12月9日 3:20
    モデレータ
  • そうです。Windows Installer(msi)が作るショートカットは通常のものとは若干異なる構造をしています。

    そのままでは、プロパティの内容も変わりますし、コンテキストメニューの内容もかなり違います。

    あ、もしかしたら YOS-01 さんの環境も何らかの理由でXPでは、ショートカットを別途作成していたなどということがあるのかも。
    それだと、自動修復が有効にならない理由もわかる。。。

    でも、必ずしも動くとは限らないのも事実なんですよね。あまりにも構造が大きい場合、いくつかのチェックは省かれるみたいだし...
    #起動時間肥大化防止のためと思われる

    そのあたりのチェックルーチンの処理配分がVistaとXPでは異なっているのかもしれません。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年12月9日 4:23
  • ショートカットは新旧ともに
    msiexec /i XXXXXXX.msi DISABLEADVTSHORTCUTS=1
    で作成したものです。
    参考になりますでしょうか?
    2009年12月9日 5:10
  • DISABLEADVTSHORTCUTS が設定されている場合は、見た目こそ通常のショートカットになりますが
    インストーラが作成したことに変わりはないため、必要に応じて自動修復は実行されます。

    なので、Vistaで自動修復される理由にはなりますが、XPでされない理由にはなりません。

    うーん。。。いったい何が原因なんですかねぇ。。。?

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年12月9日 5:45
  • やっぱりアドバタイズインストールがらみでしたかぁ。
    DISABLEADVTSHORTCUTS Property はWindows Installer 4.0以降で有効です。Windows XPの方は3.1辺りのバージョンが入っているのではないでしょうか?
    2009年12月9日 22:42
  • DISABLEADVSHORTCUTS Property は、4.0 で新設されたものじゃないですよ。少なくとも2.0時代にはすでにあります。

    Windows Installer 関連のバージョン要求を持ってきてみました。

    Windows Installer 5.0 on Windows Server 2008 R2 or Windows 7.
    Windows Installer 4.0 or Windows Installer 4.5 on Windows Server 2008 or Windows Vista.
    Windows Installer on Windows Server 2003, Windows XP, and Windows 2000.

    それぞれを句読点で分解するとこうなります。
    最後の部分をみるとわかりますが、 Windows Installer on xxx とあるように、バージョン規定がないので、1.0 からあるか、最低でも2.0以降とみなしてよい部分です。

    個人的にもわかりにくいと思うんですが(OSいらねーから、Windows Installer のバージョンだけ入れてくれれば。。。w)、いつのころからか今の記載形式になってるんですよねー。
    日本語でフィードバックできない部分だから突っ込み入れてないですけど...w

    本題。。。

    DISABLESDVSHORTCUTS プロパティは、ADVSHORTCUT(アドバタイズショートカット)を作らないようにするためのフラグです。
    アドバタイズショートカット自体は、Windows Installer で導入された特殊なショートカット形式で、アドバタイズインストール(初回利用時にインストールするモード)をショートカットの参照先ファイルで実現するために導入されたものです。

    このショートカット形式じゃないと、アドバタイズインストールされるファイルをリンクすることはできませんが、そうじゃないもの(実行時にアプリケーションレベルでチェックする)場合は、問題ありません。
    また、ショートカット形式と自動修復は全く関係ありません。

    通常形式であろうと、アドバタイズ形式であろうと、lnkファイルの中に Windows Installer の内部情報が埋め込まれており、それを参照することで自動的に修復の必要性の確認が行われるようになっています。


    ちなみに...ですが、
    アドバタイズインストールは(VSセットアップでは設定できない)、特殊なカスタムインストールの形式の一つで、初めて利用するときにインストールするというものです(Officeくらいしか対応してるの見たことありませんが)。


    自動修復については、MSから技術文書が出てるのでリンクしておきます。
    http://msdn.microsoft.com/ja-jp/library/cc440132(VS.71).aspx

    自動修復については、おそらくこれが唯一の記事だと思います(日本語では)。
    ここに書いてあることがすべてではありませんが(アンドキュメントな部分があるので)、知っておくべきことの一通りは書かれていますよ。



    おまけで宣伝w
    Windows Installer 関係のもっとディープなネタは、msi-ml にお越しくださいませ。このあたりのネタは開設当初から話題になってることの一つです。
    最近は Q&A が増えてるし、閑古鳥鳴いてますけどw
    VSセットアップや、それじゃ賄いきれない世界などなど、なんでもありでお待ちしております。

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年12月10日 2:02