桌面应用更新程序
启动时,根据主程序本地的版本文件(LocalVersion.xml),拿到远程更新地址,比较远程配置的版本文件(ServerVersion.xml)
如果有新版本,则判断更新程序是否位于系统盘,且是否为管理员身份运行
如果位于系统盘,且不是管理员身份运行,则重新以管理员身份运行更新重启,操作系统会弹出账号控制提示给客户
如果不是则打开主窗体,提示有新版本可以更新,是否下载更新
(这个机制可以达到无论客户把程序装在系统盘还是其他盘都不会影响更新操作,并且如果客户不是装在系统盘,还可以免去每次检查更新系统都弹出"权限控制"的提示给客户)
下载更新完成后,会自动删除下载的更新包,并且重新启动主程序
在主程序启动时,同时启动更新程序,即可检查更新了,如果客户选中暂时不更新,下次打开还是会提示更新,如果想跳过该版本,那就得在取消的时候做点操作
把远程最新版本号,修改到主程序本地的版本文件(LocalVersion.xml)
底部有代码百度网盘下载地址
首先更新程序的入口做运行身份检查
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
var temp = Update.HasNewVersion();
if (Convert.ToBoolean(temp.result))
{
if (Update.IsSystemPath() && ! Update.IsAdministrator())
{
Update.ReStartAppWithAdministrator();
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1(temp));
}
}
else
{
Environment.Exit(0);
}
}
}
然后是使用WebClient进行文件下载
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Security.Principal;
namespace UpdateApp
{
public class Update
{
WebClient _client;
public Update()
{
_client = new WebClient();
_client.DownloadFileCompleted += (sender, args) => { DownloadFileCompleted?.Invoke(sender, args); };
_client.DownloadProgressChanged += (sender, args) => { DownloadProgressChanged?.Invoke(sender, args); };
}
/// <summary>
/// 在异步文件下载操作完成时发生。
/// </summary>
public Action<object, AsyncCompletedEventArgs> DownloadFileCompleted { get; set; }
/// <summary>
/// 在异步下载操作成功转换部分或全部数据后发生
/// </summary>
public Action<object, DownloadProgressChangedEventArgs> DownloadProgressChanged { get; set; }
/// <summary>
/// 根据名字 关闭进程
/// </summary>
/// <param name="ProcessName"></param>
/// <returns></returns>
public static bool CloseProcess(string ProcessName)
{
bool result = false;
var temp = System.Diagnostics.Process.GetProcessesByName(ProcessName);
foreach (var item in temp)
{
try
{
item.Kill();
result = true;
}
catch
{
}
}
return result;
}
/// <summary>
/// 检查是否有新版本
/// </summary>
/// <returns></returns>
public static dynamic HasNewVersion()
{
try
{
var appPath = Directory.GetParent(Application.StartupPath).FullName;
XElement localxdoc = XElement.Load(appPath + "\\LocalVersion.xml");
var localV = localxdoc.Element("version").Value;
var localU = localxdoc.Element("url").Value;
//应用程序名称
var localAppName = localxdoc.Element("appName").Value;
//更新过程必须关掉的进程列表
var localKillList = localxdoc.Element("killList").Value;
XElement serverxdoc = XElement.Load(localU);
//服务端版本
var serverV = serverxdoc.Element("version").Value;
//更新包地址
var serverU = serverxdoc.Element("url").Value;
//是否必须更新
var serverRU = serverxdoc.Element("requiredUpdate").Value;
var temp2 = Convert.ToInt32(serverV.Replace(".", ""));
var temp3 = Convert.ToInt32(localV.Replace(".", ""));
return new
{
result = temp2 > temp3,
url = serverU,
appName = localAppName,
packName = Path.GetFileNameWithoutExtension(serverU),
killList = localKillList,
requiredUpdate = serverRU
};
}
catch {
return new { result = false };
}
}
/// <summary>
/// 异步下载文件
/// </