.NET WinForms アプリケーションの自動更新機能を作成する場合、現在実行中のアプリケーションに影響を与えずに DLL を更新するにはどうすればよいですか?
アプリケーションは更新プロセス中に実行されているため、DLL がロックされることはありません (これらの DLL は更新中に上書きする必要があるため)。
.NET WinForms アプリケーションの自動更新機能を作成する場合、現在実行中のアプリケーションに影響を与えずに DLL を更新するにはどうすればよいですか?
アプリケーションは更新プロセス中に実行されているため、DLL がロックされることはありません (これらの DLL は更新中に上書きする必要があるため)。
通常、新しいファイルを別の領域にダウンロードします。次に、シャットダウンして再起動し、起動時に新しいファイルを探して使用します(見つかった場合)。ダウンロードで問題が発生した場合にユーザーが確実に機能するものに戻れるように、常に最新の既知の動作バージョンを脇に置いておきます。
ClickOnceは、これを行うMicrosoftの優れたテクノロジであり、VisualStudio2008から直接使用できます。
他の人がすでにコメントしているように、アプリケーションをシャットダウンして再起動する必要があります。
実際のコールド アップデートを実行するための外部アップデート アプリケーションを含め、トランスペアレント モードでまさにそれを行うためのオープンソース コードを作成しました。http://www.code972.com/blog/2010/08/nappupdate-application-auto-update-framework-for-dotnet/を参照して ください。
コードはhttp://github.com/synhershko/NAppUpdateにあります(Apache 2.0 ライセンスの下でライセンスされています)。
Webサービスを介して更新をチェックする別の「ランチャー」アプリケーションがあります。更新がある場合は、それらをダウンロードしてから、別のアセンブリにあるアプリケーションを実行します。
他の方法は、ClickOnceのようなものを使用するか、他の誰かが述べたように、ファイルを別の領域にダウンロードしてアプリを再起動することです。
ただし、ClickOnceについては注意が必要です。思ったほど柔軟ではありません。また、実行するためにプログラムをより高いセキュリティレベルに上げる必要があるシステムにデプロイする場合、アプリの証明書がインストールされていないと、問題が発生する可能性があります。ClickOnceに関しては、証明書管理などのインターネット上で直接的な回答を得るのは非常に難しいと感じました。複雑なアプリをお持ちの場合は、独自のアップデーターをロールバックすることをお勧めします。これは、私がやらなければならないことです。
ClickOnceを介して公開する場合、そのすべてが自動的に処理される傾向があります。それはそれ自身の賛否両論を持っていますが、通常それをすべて自分でコーディングしようとするよりも簡単です。
ウィキペディアと15秒の両方に、ClickOnceの使用、動作方法などに関する適切な情報があります。
他の人が述べているように、ClickOnceは独自のソリューションを展開するほど柔軟ではありませんが、それほど複雑ではありません。最初は学習曲線が小さいですが、ほとんどすべてがVisual Studioにバンドルされており、ウィザードを使用しているため、通常、実用的なソリューションに出くわすのにそれほど時間はかかりません。
展開がより複雑になり(つまり、更新が必要な前提条件やアプリケーションコードを用意するだけでなく)、インストール後またはインストール前の多くのタスクを実行する必要があるため、WiXのように、 WindowsインストーラーとClickOnce。柔軟性のコストは非常に急な学習曲線です。
私がカスタムインストーラーを避けようとする唯一の理由は、さまざまな「WhatIf」シナリオを適切に処理するために多くの時間を費やしてしまうことです...
最近では、アプリが MSIX パッケージにパッケージ化されている場合、Windows は AppInstaller を使用してこのような更新を自動的に行うことができます。
アプリの新しいバージョンを 内の別のフォルダーにダウンロードしProgramFiles\WindowsApps
、ユーザーがスタート メニューからアプリを実行すると、システムは使用するフォルダーを認識します。以前のバージョンは、使用されていないときに削除されます。
この方法でアプリをパッケージ化する方法を知りたい場合は、この回答で調査結果を収集しました。