9

一度に複数のサーバーに更新をプッシュしようとしていますが、マネージャーは実行中の.exeファイルの名前を変更できることを発見しました。その知識を使用して、実行中のexeの名前を変更し、そのexeの新しいバージョンをコピーして、foo.exeのメモリ内コピーを実行している人は誰でも問題なく、foo.exeを指すショートカットを開いた人は誰でも新しいコピーを取得できるようにします。更新が適用されました。

私は明確にする必要があると思います、彼は古いコピーが魔法のように更新されることを期待していません、彼は彼らが再びexeを開くまで古いコピーを実行し続けることを期待しています、その場合それは名前を持つ新しいものを開きます古いものの。

ファイルがプログラムで使用されているという例外がスローされることがありますが、ループ内でファイルの名前を変更しようとすると、最終的には成功します。私のマシンでは、ループの中でもまだ動作させることができていません。

私の最初のそして主な質問はこれです:これをすることは今までに受け入れられますか?実行中の実行可能ファイルの名前を変更することは、有効なシナリオである必要がありますか?

第二に、それが有効なシナリオである場合、どうすればこれを確実に行うことができますか?私たちの現在の考えは、File.Move(C#)を使用して名前の変更を何度も試み、それが機能しない場合は、手動で処理できるようにエラーログに書き出すことです。

4

4 に答える 4

18

飛行機整備士と外科医がバーで会う。メカニックは、「基本的に同じ仕事をしています。壊れたものを取り出して、新しいより良い部品を入れます」と言います。外科医は、「ええ、でも修理をしている間、飛行機を飛ばし続ける必要はありません!」と言います。

アプリケーションの実行中にファイルを移動してアプリケーションを更新しようとすることは、飛行中の飛行機を修理しようとするのと同じくらい危険に思えます。可能?もちろん。壊滅的なクラッシュのリスクが大幅に増加しますか? うん。

更新するアプリケーションがマネージド アプリケーションの場合は、ClickOnce Deploymentの使用を検討してください。そうすれば、次に誰かがアプリケーションを実行したときに、利用可能な新しいバージョンがあれば、自動的にコピーされてインストールされます。これは、実行中のアプリケーションをいじろうとするよりも、はるかに安全で快適です。

于 2011-07-14T15:50:55.933 に答える
10
  1. いいえ、これは受け入れられません。こんなことしないで。これは有効な展開メカニズムではありません。これはあなたか彼の最初の手がかりだったはずです:

    ファイルが彼のプログラムで使用されているという例外をスローすることがありますが、ループで名前を変更しようとすると、最終的には成功します。

    とにかく、それはうまくいきません。彼の理論はかなり間違っています。

    その知識を使用して、彼は実行中のexeの名前を変更し、そのexeの新しいバージョンをコピーして、foo.exeのメモリ内コピーを実行している人は誰でも問題なく、foo.exeを指すショートカットを開く人は誰でも新しいコピーを取得できるようにしたいと考えていますアップデートが適用されました。

    具体的には、メモリ内のコピーが同じ名前を持っているという理由だけで、新しい実行可能ファイルに自動的に置き換えられることはありません。そもそも実行可能ファイルの名前を変更できるのは、オペレーティング システムがアプリケーションの検索にファイル名を使用していないためです。元の実行可能ファイルは引き続きロードされ、明示的にアンロードして新しい変更された実行可能ファイルをロードするまでロードされたままになります。

    Chrome や Firefox などの最新の Web ブラウザーでさえ、バックグラウンドで非常に高度な自動機能を備えているため、その存在に誰も気付かず、アップデーターは更新を適用するためにアプリケーションを閉じて再起動する必要があることに注意してください。

    ここで使者を撃つ心配はありません。顧客と技術サポート部門が最初にあなたを撃つ可能性が高くなります。

  2. 番号 1 を参照してください。

于 2011-07-14T15:21:11.293 に答える
4

私たちの組織では、EXE_A と EXE_B という 2 つのリリース フォルダーを用意することで、更新プログラムの問題を解決しました。また、ユーザーがアプリケーションを実行する EXE_A または EXE_B を指すすべてのリンクのみを持つ EXE というリリース フォルダーもあります。

プログラムの新しいバージョンを公開するときは、リンクで参照されていないフォルダーに公開し、リンク (EXE) を更新します。このようにして、ユーザーがアプリケーション/アセンブリを保持しているという例外に陥ることはありません。また、ユーザーが更新されたバージョンを実行したい場合は、EXE フォルダー内のリンクを閉じて再実行するだけです。

于 2011-07-14T15:19:13.127 に答える
1

Windows Vista/Server2k8 以降を使用mklinkしている場合は、アプリケーションを含むフォルダーへのシンボリック リンクを作成し、「シンボリック リンク フォルダー」からアプリケーションを起動してから、更新時に「AppV2」などの新しいフォルダーを作成し、 SymLink をそのフォルダーに変更して、次回ユーザーがアプリケーションを再起動したときに、気付かないうちに新しいフォルダーからアプリケーションを開始します。

開いているファイルの名前を変更することは、常に悪い選択です!

しかし、一般的には、このような「ハック」を使用する必要がある場合、常に厄介な状況になるため、とにかくより良い展開戦略を考えます。あなたのアプリケーションはわかりませんが、開始するたびに更新を確認するように構成できるため、ClickOnce が開始点になるかもしれません...

于 2011-07-14T15:32:09.600 に答える