繁体   English   中英

自我更新、下载、解压和替换exe

[英]Self-Updating, Download, Extract, and Replace Exe

我使用的是 Visual Studio 2015、C#、WPF。

我试图让MyProgram.exe能够轻松更新自身。

我有将文件MyProgram.7z下载到%UserProfile%\\AppData\\Local\\Temp\\

7z它将MyProgram.exe提取到当前运行的MyProgram.exe目录中。

当 7-Zip 提取开始时,程序会自行关闭以允许覆盖 exe。

// AppData Temp Directory
string tempDir = System.IO.Path.GetTempPath();

// MyProgram.exe Current Directory
string currentDir = Directory.GetCurrentDirectory().TrimEnd('\\') + @"\";


// ...
//
// Download Code Here
// Saves MyProgram.7z to AppData Temp
//
// ...


// Unzip MyProgram.7z
// Overwrite MyProgram.exe
//
using (Process extract = new Process())
{
    extract.StartInfo.UseShellExecute = false;
    extract.StartInfo.CreateNoWindow = false;
    extract.StartInfo.RedirectStandardOutput = true;
    extract.StartInfo.FileName = "7z.exe";
    extract.StartInfo.Arguments = "-r -y e " + "\"" + tempDir + "MyProgram.7z" + "\"" + " -o\"" + currentDir + "\"" + " *";
    // 7z.exe -r -y e "C:\Users\Matt\AppData\Local\Temp\MyProgram.7z" -o"C:\Program Files\MyProgram\" *

    extract.Start();
}


// Exit Program
// 7-Zip will continue to run in the background after MyProgram.exe has exited
//
Environment.Exit(0);

我已经测试过了,它似乎可以工作。

有没有更好的方法来做到这一点? 这种方式有什么问题吗? 我喜欢在程序中而不是在单独的帮助程序中使用它。 在这种情况下,我还需要使用7z.exe

有没有办法像timeout 5 && 7z.exe ...那样启动cmd和链式命令,并在提取后重新启动程序?

您可能想查看Squirrel 它是一个开源库,可以完全管理桌面 Windows 应用程序的安装和更新。

GitHub 上提供了入门指南: https : //github.com/Squirrel/Squirrel.Windows/blob/master/docs/getting-started/0-overview.md

还有来自 Microsoft 的 ClickOnce 部署技术:https ://msdn.microsoft.com/en-us/library/142dbbz4(v= vs.90).aspx。

没有理由重新发明轮子。

除了直接启动7z进程,您还可以:

  1. 启动将等待 5 秒的cmd /c进程,然后解压缩,重新启动应用程序
  2. 自己关机

cmd /c timeout 5 & [your unzip command] & MyProgram.exe

附注。 &用于一个接一个执行多个命令

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM