-2

私は何年もの間私のアプリケーションを更新する方法を探していましたが、それでも解決策を見つけられませんでした。(ClickOnceとは言わないでください。このアプリには適していません)。

数年前、私はMCadminを使用してMinecraftサーバーを実行していましたが、起動時に「アップデートをダウンロードしました。再起動してください」と表示されることがあることを思い出しました。私はこれがどのように行われたかを調べようとしたので、ソースコードを調べていくつかのことを見つけました。

これが私が見つけたいくつかのコードです:

private void CheckUpdateThread()
    {
        Program.AddRTLine(Color.Green, "Verifying existence of essential files...\r\n", false);

        if (!File.Exists("ICSharpCode.SharpZipLib.dll"))
            Util.DownloadURLToFile("https://internal.mcadmin.eu/ICSharpCode.SharpZipLib.dll", "ICSharpCode.SharpZipLib.dll");
        if (!File.Exists("LICENSE.txt"))
            Util.DownloadURLToFile("https://internal.mcadmin.eu/LICENSE.txt", "LICENSE.txt");

        Program.AddRTLine(Color.Green, "Essential file validation completed!\r\n", false);

        if (Program.dontUpdate)
        {
            Program.AddRTLine(Color.Green, "Update checking disabled!!!\r\n", false); 
            return;
        }

        UpdateRunning = true;

        Program.AddRTLine(Color.Green, "Checking for updates...\r\n", false);

        bool isUpdate;

        if (Program.dontUpdateMCAdmin || 1 == 1)
        {
            Program.AddRTLine(Color.Green, "MCAdmin update checking disabled.\r\n", false);
        }
        else
        {
            isUpdate = Util.DownloadURLToAndDiff("https://internal.mcadmin.eu/MCAdmin.exe", "MCAdmin.exe.new", "MCAdmin.exe");
            if (!isUpdate)
            {
                if (OutOfDateMCA)
                {
                    Program.AddRTLine(Color.Orange, "MCAdmin update downloaded! Restart MCAdmin to apply update!\r\n", false);
                    SendAdminMessage("MCAdmin update downloaded, consider restarting.", 4);
                }
                else
                {
                    Program.AddRTLine(Color.Green, "MCAdmin already up to date!\r\n", false);
                }
            }
            else
            {
                try
                {
                    if (File.Exists("MCAdmin.exe.old"))
                        File.Delete("MCAdmin.exe.old");
                }
                catch { }
                try
                {
                    if (File.Exists("MCAdmin.exe"))
                        File.Delete("MCAdmin.exe");
                }
                catch { }

                if (File.Exists("MCAdmin.exe")) 
                    File.Move("MCAdmin.exe", "MCAdmin.exe.old");
                File.Move("MCAdmin.exe.new", "MCAdmin.exe");

                OutOfDateMCA = true;
                Program.AddRTLine(Color.Orange, "MCAdmin update downloaded! Restart MCAdmin to apply update!\r\n", false);

                SendAdminMessage("MCAdmin update downloaded, consider restarting.", 4);
            }

        }

このコードは、「UpdateManager」と呼ばれるクラスの単一のvoidからのものです。

シャドウコピーのように、「MCadmin.exe.old」ファイルと「MCadmin.exe.new」ファイル全体がどのように実行されるかを確認してください。

アップデータコードにはまだまだありますが、よくわかりません。

SVNは次のとおりです: https ://code.google.com/p/mcadminfork/source/browse/

誰かがこのアップデーターがどのように達成されたかを知るのを手伝ってもらえますか?

ありがとう。

4

1 に答える 1

2

Util.DownloadURLToAndDiff()は、実際のダウンロードとファイル比較を行います。だからあなたはおそらくそれを見たいと思うでしょう。

それ以外の場合は、非常に簡単です。

  1. MCAdmin.exe.newをダウンロードします
  2. MCAdmin.exe.oldを削除します(以前の更新から残っています)
  3. 現在のMCAdmin.exeを削除してみてください
  4. 削除に失敗した場合(おそらくファイルが使用中)、MCAdmin.exeの名前をMCAdmin.exe.oldに変更します。
  5. MCAdmin.exe.newMCAdmin.exeの名前を変更します
于 2012-09-16T13:00:37.110 に答える