2017-05-10 42 views
1

私には、アップデータが組み込まれたfoo.exeというアプリケーションがあります。サーバーに接続し、更新プログラムがあれば現在の(実行中の)アプリケーションの名前をfoo.exe.bakに変更し、foo.exeをダウンロードしてApplication.Restartと呼ぶと、新しいバージョンのfoo.exeが起動します。これはうまくいくようです...ほとんどの時間。私がそれを実行する1台のコンピュータは常にそうであるように見えますが、時には新しいバージョンをダウンさせるが古いバージョンをロードすることもあります。 Application.Restartを呼び出すボタンを使用してアプリケーションを再起動すると、正しいバージョンが表示されます。VB.NET Application.Restartの動作 - 予期しない結果

この再起動に失敗したときに、ローカルシステム上のファイルは1.2であり、サーバー上では1.2ですが、実行中のバージョンは今更新した1.1です。最新の実行可能バージョンと同様に、DLLアップデートのチェックを可能にするために、最近アップデータが調整されているため、実行中のアプリケーション(1.1)のバージョンを期待バージョンと比較してexeファイルのバージョン(1.2)バージョンの不一致のために別のアップデートを引き起こさない。結局のところ、私のアプリケーションは、それが更新されたバージョンだと信じているところで間違った側の失敗をしていることになります。

私は再起動を呼び出す前に1秒の遅延がありました。これを5に増やしても、問題を修正することはありませんでした。 Application.Restartはどのように機能していますか? 私はShell(Application.ExecutablePath)Application.Exitを試しましたが、それはうまくいかず、アプリケーションを終了させるだけでした。私のアプリケーションを閉じてfoo.exeを再起動する信頼できる方法はありますか?

おかげ

+0

マルウェア対策は、常にあなたに片頭痛を与えることです。彼らは決してどこからも見えない実行可能ファイルを好むことは決してありません。優しそうな人たちは、スキャンするために楽しい時間を過ごし、まだそこにないように見せます。しかし、なぜそれが.bakファイルを実行できるのかを簡単に説明できません。これらの操作のいずれかが失敗するたびに、大声で十分に叫んでください。ユーザーアカウントには、インストールディレクトリにファイルの名前を変更したり作成するのに十分な権限がありません。 UACは通常の場合、* c *¥program filesを保護します。 –

+0

** foo.exe **ファイルで 'Process.Start()'を使ってみましたか?そして今すぐ(**)** foo.exe.bak **ファイルから抜けてしまいましたか?黙って再起動するのを避けてください。また、可能であれば、おそらくClickOnceの仕事です。 –

+0

ハンス:私が問題を抱えているデバイスでは、テスト中にソフトウェアがc:\ fooにあります。伝統的にはインストールされていません。 ファイルの名前を変更し、新しいDLLをそのフォルダにダウンロードし、新しい実行可能ファイルをダウンロードします。もしそれが権利問題であったなら、私はそれらも失敗することを期待するでしょう。私は、マルウェア対策の対話を見ていきます。私の最初の考えは、Application.Restart()が実行中のものを再ロードしている可能性がありますが、それは2番目の呼び出しで動作することを説明しませんでした。 ありがとう –

答えて

0

この後、タイミングの問題でした。アプリケーションが必要以上に更新されていないかのように起動して、アプリケーションがそれより先に進んでいた場合、アップデーターは「おい、私はアップデートがあります!アプリケーションがすでに開始されていました。

-1

あなたはこれが達成される期待するにはどうすればよい

をfoo.exe.bakするために、現在の(ランニング)アプリケーションの名前を変更しますか? Windowsでは、現在実行中のプログラムファイルの名前を変更することはできません。

自動アップデートを実行するほとんどのアプリケーションには、アップデートを検出してシャットダウンしたときにメインプログラムがアップデータプログラムを起動する2番目の「アップデータ」プログラムがあります。更新プログラムは、メインプログラムが終了するまで待機し、更新が必要なものを更新し、メインプログラムを再起動してから終了します。

私はまた、メインプログラムが "更新"ファイルをダウンロードしてから、バッチファイルの名前を変更してプログラムを再起動する場所を終了する前にクイック.batファイルを開始することを確認しました。

いずれにしても、* .exeファイルがまだ実行されている間に* .exeファイルを更新しようとすると、奇妙な結果に終わるでしょう。

他に注意すべき点の1つは、Program Filesフォルダがデフォルトで標準特権ユーザーアカウントの読み取り専用であることです。エンドユーザーがこのフォルダ内のファイルを更新できるようにするには、元のインストールプロセス中にフォルダの既定のアクセス許可を変更する必要があります。

+2

それを許可します。 MMFはディレクトリエントリではなくファイルデータにのみロックをかけます。そして、あなたの推測が正しければ、それはずっと前にそれを発見したでしょう。 –

+0

私は実行中の実行可能ファイルに対して行うことができるいくつかのうちの1つが名前を変更していることに気付いた。 –