コメンテーターの建設的な批判を考慮して、「古い」機能の改善を含むいくつかの新しい機能を追加することにより、そのコードを改善することが決定されました。
- アップデートの自動チェック、ダウンロード、インストール。
- 更新の瞬間(新しい)を選択する機会をユーザーに提供します。
- 改善されたファイルバージョン検証メカニズム。
- 更新ファイルの整合性の確認(新規)
前の記事のテキストを再入力しないようにするために、ここではコードの処理された部分のみに焦点を当てます。
キーポイント
前の記事のコメンテーターは、次のコードの欠陥を特定しました(私が依存したもののみを示します)。
- 最初に新しいファイルをダウンロードすることをお勧めします。これにより、ダウンロードの途中で何らかの理由でアプリケーションが終了し、ユーザーが.bakファイルと不完全な.exeのままである場合、つまり、 動作中のアプリケーションなし。 ( DarkByte );
- チェックサムチェックが表示されませんでした。 ( ナウム );
- ユーザーに選択肢を残さずに単一の「OK」ボタンを持つモーダル(ほとんどの場合)情報ウィンドウを表示することは、良い習慣ではありません。 静かに、いつの間にかすべてを行う必要があります。あるいは、ユーザーがより便利になったときに、なんとかしてそれを行う機能を控えめに提供する必要があります。 ( イロルン );
- 持っているバージョン比較が間違っています。 たとえば、9.12.2から10.0.0にアップグレードするときに問題が発生します。 ( eyeless_watcher )
- また、バージョンタイプを直接比較できないのはなぜですか? ( teleavtomatika )。
もちろん、これらに類似した他のコメントもありましたが、私はそれらのすべてを与えませんでした、そして、私は問題を考慮するために進むことを提案します。
修正
ファイルのダウンロード中にエラーが発生し、その結果ファイルが破損する可能性があるため、コードに対して次の修正が行われました。
public void checkUpdates(){ try { if (File.Exists("launcher.update") && new Version(FileVersionInfo.GetVersionInfo("launcher.update").FileVersion) > new Version(Application.ProductVersion)) { Process.Start("updater.exe", "launcher.update \"" + Process.GetCurrentProcess().ProcessName + "\""); Process.GetCurrentProcess().CloseMainWindow(); } else { if (File.Exists("launcher.update")) { File.Delete("launcher.update"); } Download(); } } catch (Exception) { if (File.Exists("launcher.update")) { File.Delete("launcher.update"); } Download(); } }
最初に、 launcher.update更新ファイルが存在するかどうかを確認します。また、ファイルの拡張子も重要ではないため、ファイルのバージョンも確認します。 ファイルが破損している場合、 try catch例外ハンドラーは、コードを実行して破損したファイルを削除し、サイトで更新プログラムを確認およびダウンロードする機能を起動します。
ファイルが全体であり、そのバージョンが現在のバージョンよりも高い場合、追加のupdater.exeユーティリティが起動され、メインプログラムファイルを置き換える操作が実行されます。 それはすでに以前だったので 、私は詳細を書きません。
したがって、更新ファイルの整合性を検証します。
private void Download() { try { XmlDocument doc = new XmlDocument(); doc.Load(@"http://mysite/version.xml"); remoteVersion = new Version(doc.GetElementsByTagName("version")[0].InnerText); localVersion = new Version(Application.ProductVersion); if (localVersion < remoteVersion) { if (File.Exists("launcher.update")) { File.Delete("launcher.update"); } WebClient client = new WebClient(); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); client.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); client.DownloadFileAsync(new Uri(@"http://mysite/launcher.exe"), "launcher.update"); } } catch (Exception) { } }
さらに、ファイルバージョン検証プロセスの機能が変更され、その重要なポイントは、組み込みのSystem.Versionツールを使用したファイルバージョン比較の実装であり、その結果、「9.12.2」および「10.0.0」などの正しいバージョン検証の問題が排除されました。
新しいバージョンが検出された場合、アクションは次のとおりです。プログラムは自動的にバックグラウンドで更新ファイルをダウンロードし、ユーザーにこの更新の利用可能性に関するメッセージを提供し、イベントの開発のために2つのオプションを選択できます:
- 更新に同意することにより 、プログラムは即座に再起動し、必要なすべてのアクションを実行しました。
- プログラムの更新を拒否すると、ダウンロードした実行可能ファイルの横にファイルが保存されます。 このオプションでは、通知を表示せずにプログラムを次回起動したときに更新プロセスが発生します。
おわりに
書き直されたコードは、以前のバージョンと比較してより完璧であることが判明し、「ビット」ファイルに更新を適用する可能性、およびダウンロードされたファイルのチェックサムをサーバー上のバージョンとチェックする機能の実装の欠如も排除しました。
そして、建設的な批判に対して、 DarkByte 、 naum 、 iroln 、 eyeless_watcher 、 teleavtomatika 、 wireの方々に特別な感謝を申し上げます。
よろしく、アンドリュー・ヘルダー!
PS:マイナスの中から親切な人々-あなたがそう決めた理由を書いてコメントで親切にしてください。 どこが間違っているのかを知るのは興味深い。
UPD。 「不正な手」、「不正なコード」などについてまだ考えている人には、少なくとも何が間違っているかをコメントで書いてください。 あなたの建設的な批判に基づいて、私は私の仕事を改善し、それによってより良いコードを書く方法を学びます。
事前に感謝します!