.NET winformsアプリケーションがClickOnceを使用せずに自分自身を更新する最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/150994

質問

技術的な理由により、ClickOnceを使用して.NETアプリケーションとそのアセンブリを自動更新することはできません。 .NETで自動更新を処理する最良の方法は何ですか?

役に立ちましたか?

解決

アップデータアプリケーションブロックは先駆けのようなものだったと思いますClickOnceへ。調査する価値があるかもしれません。そのソースコードを見るだけで、いくつかのアイデアが生まれます。

他のヒント

商用/オープンソースの製品があります: wyBuild& wyUpdate 。パッチ機能があり、非常に使いやすいです。

編集:私は負の数に投票されるようになりましたが、私の投稿は単なる露骨な販売ではありませんでした。私たちのアップデーターwyUpdateは、C#で書かれたオープンソースであり、BSDライセンスの下でライセンスされています。

.NETフレームワークを使用してゼロからアップデーターを構築しようとする人を助けると思いました。

ただし、必要な場合は投票してください。

約3〜4年前に、アプリの外部にある例を公開しました。更新が検出され、アプリがアップデーターを呼び出してansがシャットダウンした後、更新が完了し、アプリが再起動します。

以前のGotDotNetサイトでサンプルを公開しました...試しに見つけなければなりません。

完璧に機能し、作成に約1〜2時間かかりました。

Indigo Roseには TrueUpdate という製品があり、これも自動的に行います。過去に管理対象アプリと管理対象外アプリの両方から使用しました。基本的には、サーバーに置くファイル(http、ftp、好きなもの)です。次に、クライアント側のEXEを呼び出して、更新を確認します。更新ファイルはプルされ、クライアント上にあるバージョンを検出するロジック(選択、DLL検出、レジストリキーの読み取りなど)があります。次に、適切なアップデータを見つけ、実行するためにファイルをダウンロードします。プロキシでも同様に機能します。

彼らがしない唯一のことは、実際にパッチをビルドすることです。あなたは手動で、または彼らが持っている別の製品でそれをしなければなりません。それは商業的な解決策であり、必要な場合でも非常にうまく機能します。

独自のローリングの開始点として、おそらく Alexを見る価値があります。 MSDNのFeinmanの記事には、「。NET Compact Frameworkを使用した自動更新アプリケーションの作成」というタイトルが付けられています。

独自に作成します。

初めて書くのは少し難しいと聞きましたが、その後は簡単になります。

まだリストを書いていないので(リストに載っていますが)、私が考えたことのいくつかを紹介します。これは自己更新に重要であるため、正確なdllバージョンを維持してください。そして、アップデーターが自分自身を更新できることを確認してください。

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に入れてアプリケーションを再起動します。

かなり前のプロジェクトで、.NET Compact Framework 1.0を使用して、自動更新アプリケーションを作成しました。 SqlCEのCAB展開機能を使用してファイルをデバイスに取得し(今はSync Frameworkを使用します)、CABの展開とファイルの更新を行う別のexeがありました。

更新は次のようになります。ユーザーは更新を求められ、ボタンをクリックしてUIアプリケーションからドロップアウトします。アップデータexeが引き継ぎ、サーバーからcabファイルを取得し、現在のdllをバックアップし、wceloadでcabファイルを解凍します。その後、UIが再起動され、失敗した場合、更新はロールバックされます。これはまだコンパクトなデバイスでは興味深いシナリオですが、現在は単なるsqlceよりも優れたツールがあります。

clickonceがオプションではない場合、アップデータアプリケーションブロックと同期フレームワークを見て、これを実装することは確かです。ただし、既に述べた回答の1つのように、上書きしたいdllはおそらくexeで使用中にファイルがロックされるため、別の実行可能ファイルが必要になると思います。

私は独自の自動更新プログラムを作成しました。自動更新プログラムは、URLを含むアプリケーションに共通の設定ファイルを使用して、最新バージョンをダウンロードするか、更新が必要かどうかを確認します。

この方法でアップデーターを実行すると、アプリが更新されるかどうかが決まります。その後、通常の操作の一部として、更新されたアップデーターとパッチをチェックするアプリケーションが実行されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top