技術的な理由により、ClickOnce を使用して .NET アプリケーションとそのアセンブリを自動更新できません。.NET で自動更新を処理する最良の方法は何ですか?
9 に答える
商用/オープンソースの製品があります:wyBuild&wyUpdate。パッチ機能があり、使い方はとても簡単です。
編集:私は負の数に投票されていますが、私の投稿は単に露骨な売りではありませんでした。私たちのアップデーターwyUpdateはオープンソースであり、C#で記述されており、BSDライセンスの下でライセンスされています。
.NETFrameworkを使用してアップデーターを最初から作成しようとする人には役立つかもしれないと思いました。
しかし、あなたがしなければならないなら、私を投票してください。
アップデータアプリケーションブロックは、ClickOnceの前身のようなものだったと思います。調査する価値があるかもしれません。そのソースコードを見るだけで、いくつかのアイデアが浮かび上がるかもしれません。
自分で作成するための出発点として、MSDNのAlexFeinmanの記事「.NETCompactFrameworkを使用した自己更新アプリケーションの作成」を参照する価値があります。
約 3 ~ 4 年前に、アプリの外部にある例を公開しました。更新が検出された場合、アプリはアップデーターを呼び出してシャットダウンし、更新が完了してアプリが再起動します。
私は古い GotDotNet サイトで例を公開しました...私はそれを見つけようとする必要があります。
それは完璧に機能し、書くのに約1〜2時間かかりました.
Indigo Rose にはTrueUpdateという製品があり、これもこれを行います。私は過去にマネージド アプリとアンマネージド アプリの両方からそれらを使用しました。これは基本的に、サーバーに置くファイルです (http、ftp、好きなもの)。次に、クライアント側の EXE を呼び出して更新を確認します。更新ファイルが取得され、クライアントにあるバージョンを検出するロジックが含まれています (選択、DLL 検出、レジストリ キーの読み取りなど)。次に、適切なアップデーターを見つけて、実行するファイルをダウンロードします。プロキシ経由でもうまく機能します。
彼らがしない唯一のことは、実際にパッチを作成することです。手動で行うか、別の製品を使用して行う必要があります。これは商用ソリューションであり、必要に応じて非常にうまく機能します。
自分で書いてください。
初めて書くのは少し難しいと聞きましたが、その後は簡単になります。
私はまだ書いていませんので(私のリストにはありますが)、私が考えたことのいくつかをあなたに与えることができます。これは自己更新にとって重要であるため、正確なdllバージョンを維持します。そして、アップデーターがそれ自体を更新できることを確認してください。
かなり前のプロジェクトで、.NET Compact Framework 1.0 を使用して、自動更新アプリケーションを作成しました。SqlCE の CAB 展開機能を使用してデバイスにファイルを取得し (今は Sync Framework を使用します)、CAB のアンパックとファイルの更新を行う別の exe を用意しました。
更新は次のようになります。ユーザーは更新を求められ、ボタンをクリックして UI アプリケーションからドロップアウトします。アップデーター exe が引き継ぎ、サーバーから cab ファイルを取得し、現在の dll をバックアップし、wceload で cab ファイルを解凍します。その後、UI が再起動され、失敗した場合は更新がロールバックされます。これはコンパクトなデバイスでは興味深いシナリオですが、今では sqlce よりも優れたツールがあります。
clickonce がオプションでない場合は、アップデータ アプリケーション ブロックと同期フレームワークを確認して、これを実装します。しかし、以前の回答の1つがすでに述べたように、上書きしたいdllはおそらくexeで使用中にファイルがロックされているため、別の実行可能ファイルが必要になると思います。
私は独自の autoupdater を作成しました。autoupdater は、最新バージョンをダウンロードするための URL を含む共通の構成ファイルをアプリケーションに使用し、更新が必要かどうかを確認します。
このようにして、アプリを更新するかしないかのどちらかであるアップデーターを実行してから、通常の操作の一部として、更新されたアップデーターをチェックしてパッチを適用するアプリケーションを実行します。
Program.cs ファイルで、次のようにします。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Update();
Application.Run(new Form1());
}
private static void Update()
{
string mainFolder;
string updateFolder;
string backupFolder;
foreach (string file in
System.IO.Directory.GetFiles(updateFolder))
{
string newFile = file.Replace(
updateFolder, mainFolder);
if (System.IO.File.Exists(newFile))
{
System.IO.File.Replace(file, newFile, backupFolder);
}
else
{
System.IO.File.Move(file, newFile);
}
}
}
さらに、必要に応じてディレクトリ構造を取得するために再帰的にすることもできます。これにより、プロジェクト内の任意の .dll を更新できます。実際、メインの .exe 以外のすべて。次に、アプリケーション内の別の場所で、更新が必要なファイルをサーバー (または任意の場所) から取得し、updateFolder に入れてアプリケーションを再起動します。