Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个应用程序是如何自我更新的?_C# - Fatal编程技术网

C# 这个应用程序是如何自我更新的?

C# 这个应用程序是如何自我更新的?,c#,C#,多年来,我一直在寻找更新我的应用程序的方法,但仍然没有找到解决方案。(请不要说ClickOnce,它不适合此应用) 几年前,我曾使用MCadmin运行Minecraft服务器,我记得当它启动时,有时会说“更新已下载,请重新启动!”。我试图找出这是如何做到的,所以我一直在寻找源代码并找到了一些东西 以下是我发现的一些代码: private void CheckUpdateThread() { Program.AddRTLine(Color.Green, "Verifying

多年来,我一直在寻找更新我的应用程序的方法,但仍然没有找到解决方案。(请不要说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:

有人能帮我找出这个更新程序是如何实现的吗

谢谢。

Util.DownloadURLToAndDiff()执行实际下载和文件比较。所以你可能想看看这个

否则,它非常简单:

  • 下载MCAdmin.exe.new
  • 删除MCAdmin.exe.old(以前更新的剩余内容)
  • 尝试删除当前的MCAdmin.exe
  • 如果删除失败(文件可能正在使用),请重命名MCAdmin.exe MCAdmin.exe.old
  • 重命名MCAdmin.exe.new MCAdmin.exe

  • 你的确切问题是什么?在代码中,程序再次下载自己的代码库并替换它。。。(不检查签名就有很高的安全风险…)谢谢我很难理解它,现在它清楚了!没问题。如果这回答了您的问题,请将其标记为已接受的答案()。好的,哦,还有一件事,我进行了主窗体加载事件,但它没有启动更新,如果它不存在,所有启动的东西都会发生在哪里?快速搜索显示它在第197行的program.cs中实例化。谢谢,但我无法在WPF上使用它,线程问题太多了,比如“另一个线程拥有它”,或者“必须是STA线程”!