C# 这个应用程序是如何自我更新的?
多年来,我一直在寻找更新我的应用程序的方法,但仍然没有找到解决方案。(请不要说ClickOnce,它不适合此应用) 几年前,我曾使用MCadmin运行Minecraft服务器,我记得当它启动时,有时会说“更新已下载,请重新启动!”。我试图找出这是如何做到的,所以我一直在寻找源代码并找到了一些东西 以下是我发现的一些代码:C# 这个应用程序是如何自我更新的?,c#,C#,多年来,我一直在寻找更新我的应用程序的方法,但仍然没有找到解决方案。(请不要说ClickOnce,它不适合此应用) 几年前,我曾使用MCadmin运行Minecraft服务器,我记得当它启动时,有时会说“更新已下载,请重新启动!”。我试图找出这是如何做到的,所以我一直在寻找源代码并找到了一些东西 以下是我发现的一些代码: private void CheckUpdateThread() { Program.AddRTLine(Color.Green, "Verifying
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()执行实际下载和文件比较。所以你可能想看看这个
否则,它非常简单:
你的确切问题是什么?在代码中,程序再次下载自己的代码库并替换它。。。(不检查签名就有很高的安全风险…)谢谢我很难理解它,现在它清楚了!没问题。如果这回答了您的问题,请将其标记为已接受的答案()。好的,哦,还有一件事,我进行了主窗体加载事件,但它没有启动更新,如果它不存在,所有启动的东西都会发生在哪里?快速搜索显示它在第197行的program.cs中实例化。谢谢,但我无法在WPF上使用它,线程问题太多了,比如“另一个线程拥有它”,或者“必须是STA线程”!