独自の自動アップデーターを作成する場合、従う必要のある一般的なフレームワークはありますか?
少し前に、メインアプリケーションの前に最初にロードされる「ブートストラッパー」を作成する方法について読んでいました(ファイルロックなどのために実行中のアプリケーションを更新できないため)
では、これに関するヒント/ベストプラクティスはありますか?
独自の自動アップデーターを作成する場合、従う必要のある一般的なフレームワークはありますか?
少し前に、メインアプリケーションの前に最初にロードされる「ブートストラッパー」を作成する方法について読んでいました(ファイルロックなどのために実行中のアプリケーションを更新できないため)
では、これに関するヒント/ベストプラクティスはありますか?
おそらく自分で書く必要があります。FORが述べたように、基本的な考え方は、プログラムの最新バージョン(EXEを想定しています)をサーバーに配置し、起動時にアプリケーションにサーバーをチェックさせ、サーバーからEXEをダウンロードすることです。新しいバージョン。
私は通常、アプリケーションが起動時に呼び出す Web サービスとしてこれを実装しました。このアプローチに関するいくつかの警告:
Web サービス メソッドは、サーバー上の EXE のバージョン番号を取得し、それを呼び出し元のバージョン番号と比較する必要があります。Assembly クラスを使用してサーバー EXE のバージョン番号を読み取ると、Web サービス インスタンスが実行されている限り (少なくとも 20 分間) ファイルがロックされます。その結果、サーバー上の EXE を新しいバージョンに置き換える際に問題が発生する場合があります。代わりに AssemblyName クラスを使用します。これにより、アセンブリをロード (およびロック) せずにアセンブリ情報を読み取ることができます。
呼び出し元のアプリケーションは、それ自体のファイルを新しいバージョンに置き換えることはできません。実行中のアプリケーション ファイルを削除または更新することはできません。ただし、実行中に自身のファイルの名前を変更することはできます。したがって、自動更新の秘訣は、アプリケーション自体の名前を変更し (たとえば、"MyApplication.exe" を "MyApplication_OLD.exe" に)、新しいバージョンをアプリケーション フォルダー ("MyApplication.exe" という名前) にダウンロードし、ユーザーに通知することです。アプリケーションの再起動が必要な更新が発生したことを通知し、終了します。ユーザーがアプリケーションを再起動すると、新しいバージョンが起動します。このバージョンは、古いバージョンをチェックして削除します。
このような更新後にアプリケーションを自動的に再起動する自動更新を実行するのは非常に注意が必要です (別のプロセスを開始してから、自動再起動プロセスが開始される前に独自のプロセスを終了する必要があります)。アプリを再起動しなければならないことについて、ユーザーから不満を言われたことは一度もありません。
まず第一に、市場に出回っているインストーラー/アップデータ製品のいずれかがニーズに合っている場合は、おそらくそれらを使用する必要があります. そうは言っても、私は少し前にこのようなシステムを自分で構築する喜びに恵まれました. はい、インストーラー/アップデーターにはクライアント側に 2 つの部分が含まれているため、次のことが可能です。
~ パート A は、最新バージョンが保存および公開されているサーバーに接続します。パート B の新しいバージョンが利用可能であれば、それをダウンロードして開始します。
~ パート B では、実際のアプリケーションのインストール/更新に焦点を当てます (また、パート A の更新をダウンロードしてインストールすることもできます)。
それとは別に、インストーラー/アップデーターで次の 4 つの操作を常に考慮することをお勧めします。
インストールとアンインストール
更新とロールバック (つまり、最後の更新を元に戻す)
ユーザーが夜間に自動的に更新するシステムを使用している場合、ロールバックは重要です。更新が毎回失敗した場合、ユーザーはロールバックして、問題を修正している間も作業を続けることができます。
最後に、インストーラー/アップデーターは、インストール/更新するアプリケーションにとらわれないようにし、そのアプリケーションが変更されたときに、インストーラー/アップデーター システムへの影響が最小限になるようにする必要があります。
C++ で作業したアプリのアップデーターをコーディングしましたが、一般的な構造は同じです。
これは私たちにとって非常にうまく機能し、最初に行うこととして常に新しい「アップデーター」をダウンロードしたため、他の方法では機能しない可能性のあるいくつかのファンキーな新しいものを処理できました.
独自の自動更新ソフトウェアを作成しました。だからここに私のヒントがあります... それをしないでください!! もちろん、これはすべて特定のシナリオに依存しますが、私の会社が遭遇した問題は次のとおりです。
私たちのソフトウェアの問題は、すべての Windows プラットフォームで多くの柔軟性とサポートが必要だったことです。私たちが書いたソリューションは問題なく動作しましたが、拡張性がなく、Windows のバージョンが変更されたとき、またはラボのバージョンとはまったく異なっていたときに失敗し始めました。私たちは最終的にソフトウェアを購入しましたが、あなたにも同じことをお勧めします。興味のある方は、AutoUpdate+ という製品を購入しました (リンク テキスト)。
これは、WinFormsおよびWPFアプリに対する特定のニーズに対応するために作成したオープンソースソリューションです。一般的な考え方は、可能な限り最小のオーバーヘッドで、最大の柔軟性を持つことです。
そのため、統合は非常に簡単で、ライブラリは同期操作を含め、ほとんどすべてを実行します。また、柔軟性が高く、実行するタスクと条件を決定できます。ルールを作成します(またはすでに存在するタスクを使用します)。最後に重要なのは、更新ソース(Web、BitTorrentなど)とフィード形式のサポートです。実装されていないものはすべて、自分で作成できます。
コールドアップデート(アプリケーションの再起動が必要)もサポートされており、タスクに「ホットスワップ」が指定されていない限り、自動的に実行されます。
これは、サイズが70kb未満の1つのDLLに要約されます。
詳細については、http://www.code972.com/blog/2010/08/nappupdate-application-auto-update-framework-for-dotnet/をご覧ください。
コードはhttp://github.com/synhershko/NAppUpdateにあります(Apache 2.0ライセンスの下でライセンスされています)
もう少し時間があればもっと拡張する予定ですが、正直なところ、現在サポートされていないものについては、自分ですぐに拡張できるはずです。
ClickOnce はうまく機能しませんでした。お客様のサーバーにデータベースをインストールします。更新を行う前に、彼らの側のデータベースを更新する必要があります。私たちの顧客は 2 人か 3 人ではありません。そのため、ClickOnce について何か重要なことを見逃していない限り、アプリケーションに対して ClickOnce を実行することは、実際には最良のアイデアではありません。
私がしたことは、バージョン番号のフィールドをデータベースに追加することでした。私たちの ftp サイトには、アプリケーションの各バージョン番号のフォルダーを含むバージョン フォルダーがあります。その特定のバージョンのフォルダー内に、setup.exe と setup.exe が起動する msi ファイルを含む zip ファイルを配置します。すべての前提条件はベンダーのサイトからダウンロードされ、FTP サイトが大量のダウンロードでヒットしないようにします (移動したときは .Net 3.5)。アプリケーションが起動すると、データベース内のフィールドでバージョン番号がチェックされ、それが現在のバージョンのアセンブリ バージョンと異なる場合は、ftp サイトに接続し、その新しいバージョンのフォルダーから zip ファイルをダウンロードして解凍し、セットアップを実行します。これにより、新しいバージョンの .Net または追加されたその他の要件がインストールされます。
この zip には、AppUpdater ボイラープレート コードを含む単語検索ジェネレーター ツールのソース コードが含まれています。
http://cid-842434ebe9688900.skydrive.live.com/self.aspx/Games/WordSearchGenerator-src-v1.3.zip
名前に「AppUpdater」が含まれる 3 つのソース モジュールを探します。
これは非常に単純化されており、単一アセンブリ アプリケーションでのみ機能します。MSI ファイルがありません。ただのEXEです。更新チェックは自動的に行われますが、更新はユーザーの確認後にのみインストールされるという考え方です。
アップデーターの仕組み:
「最新バージョン」情報を含む URL と、実際の新しいバージョンが配置されている 2 番目の URL から XML ドキュメントをロードします。updater ロジックは XML ドキュメントの署名を検証しますが、それは気にしないかもしれません。その後、アップデーターは現在のバージョンを最新バージョンと比較し、更新が利用可能かどうかをアプリケーションに伝えることができます。アップデーターは、置換の問題も処理します。
このモデルでは、更新中にアプリの 3 つの「ライフサイクル ステージ」があります。通常のコースでは、アプリは更新をチェックしてから、通常どおり実行します。ある時点で、ユーザーが利用可能なアップデートをインストールすることを確認すると、アップデーターはアプリを一時的な場所にダウンロードし、新しくダウンロードした exe を使用してプロセスを開始します。その後、アップデータ ロジックは最初のプロセスを終了します。2 番目のプロセスは、最初のプロセスによって与えられたコマンドライン引数に基づいて、それが新しくダウンロードされたコピーであり、それ自体を複製する必要があることを認識します。それ自体を元の場所 (コマンド ラインで指定) にコピーし、それを開始します。exe、および終了します。3 番目のプロセスは通常どおり開始され、更新があったことを確認し、一時的な exe のコピーを削除します。その後、更新のチェックを含め、通常どおり実行されます。更新がないことがわかり、通常どおりに実行されます。これは、インプレース更新ロジックの操作をカバーしています。
これはすべて、Windows フォームまたは WPF ウィンドウのコンストラクターの次の行によって処理されます。
_Updater = new AppUpdater.SimpleAppUpdater(_MyManifestUrl);
_Updater.Startup(App.CommandLineArgs);
更新のチェックの問題は、バックグラウンド ワーカー スレッドを作成して実行する、コンストラクター内の数行のコードによっても処理されます。
_Worker = new System.ComponentModel.BackgroundWorker();
_Worker.DoWork += CheckLatest;
_Worker.RunWorkerCompleted += CheckCompleted;
_Worker.RunWorkerAsync();
CheckLatest は次のとおりです。
void CheckLatest(object sender, System.ComponentModel.DoWorkEventArgs e)
{
lock (_Updater)
{
if (_Updater.UpdateIsAvailable) // Checks for update
{
// can update a textbox (etc) here. Be careful of InvokeRequired.
}
}
}
完了したイベントは次のとおりです。
void CheckCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
if (!e.Cancelled && e.Error == null)
{
lock (_Updater)
{
// only display the about box if there is an update available.
if (_Updater.HaveCheckedForUpdate && _Updater.UpdateIsAvailable)
{
// do whatever you want here. Eg, pop a dialog saying
// "an update is available"
About about = new About();
about.Message= "An update is available";
about.ShowDialog();
}
}
}
}
WinForms または WPF アプリから動作します。コンソール アプリからも機能すると思いますが、試したことはありません。
(署名されている可能性がある) マニフェスト ファイルの作成は別のタスクであり、ここでは説明しません。
考えてみれば、これは基本クラスの AutoUpdatingForm (WinForms の場合) または AutoUpdatingWindow (WPF の場合) としてパッケージ化したほうがよいかもしれません。しかし、私はその一歩を踏み出すことはありませんでした。
.Net を使用している場合、ClickOnce を使用しないのはなぜですか? 箱から出してすぐに話しているすべてのことを実行し、セットアップはほとんど必要ありません。
10年前に(.NETではなく)自動アップデーターを作成しましたが、その要点は、アプリケーションのバージョンIDが起動時にチェックされるということでした。この場合、アプリは現在のバージョンを持つデータベーステーブルを照会し、実行中のバージョンが現在のバージョンよりも小さい場合、ユーザーは最新バージョンをダウンロードするように求められました。URLをチェックすることでも同じことができます。
私がまだ試していない解決策の 1 つは、サイレント モードで実行できるインストーラーを用意することです。
アプリケーションはサーバーを呼び出し、更新が必要な場合は最後のインストーラーをダウンロードし、サイレントまたは更新フラグを付けて実行します。
多くの利点があります。