WinForm自动更新程序
WinForm自动更新程序
刚刚开始搞Winfrom开发的小伙伴经常遇到这样一个问题:程序在公司内部广泛使用,特别是在自动化的工厂内部,在需求频繁变更的时候每次更新都是一件心态爆炸的事情,这时候一个自动更新的程序就非常有必要。
在查找了网上众多资料后,发现不是收费的,就是代码没法使用,最终决定还是自己写一个。根据网上资料学习和自身业务,完成下述代码。
思路
在用户打开程序的时候,无法直接更新本体程序,那就需要新建一个小的更新程序来进行更新的事情。
在主体程序的开始时先行判断当前版本是否为最新,不是则开始调用更新程序并关闭主体程序。更新程序完成更新后再回调主体程序。
代码
更新程序
MaterialManageEntities db = new MaterialManageEntities();
Thread.Sleep(5000);//此处暂停是为了等主体程序完全关闭才能删除
string sys_path = db.System_Config.Where(x => x.Name == "Path").FirstOrDefault().Text;//获得保存在数据库的下载路径
var list = db.File_Path.ToList();
foreach (var info in list)//删除旧的文件
{
FileInfo file = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, info.Name));
file.Delete();
}
WebClient wc = new WebClient();
foreach (var info in list)
{
wc.DownloadFile(new Uri(sys_path + info.Name), info.Name);//要下载文件的路径,下载之后的命名
}
string path = Application.StartupPath + "\\";
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "主体项目.exe";
process.StartInfo.WorkingDirectory = path;//要掉用得exe路径例如:"C:\windows";
process.StartInfo.CreateNoWindow = true;
process.Start();
Application.Exit();
主体中如何调用
//根据电脑的MAC地址从数据库得到该电脑对应的版本号,这是由于之前的业务决定的,如果不需要统一管理,可以采取本地XML文件记录
MaterialManageEntities db = new MaterialManageEntities();//这块使用的是微软自带的ADO.NET连接数据库,可以改成你们习惯的写法
//获得MAC地址
string macAddr = PublicMethod.MachineMac();
var machine = db.MES_MachineMacList.Where(x => x.MachineMac == macAddr).FirstOrDefault();
var version = db.System_Config.Where(x => x.Name == "Version").FirstOrDefault().Text;
if (machine != null)//判断是否有记录授权
{
if (machine.IsBan == false)
{
if (machine.Version.ToString() == version)//判断版本号
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Login fl = new Login();
fl.ShowDialog();
if (fl.DialogResult == DialogResult.OK)
{
Application.Run(new Form1());
}
}
else
{
if (MessageBox.Show("检查到新版本,是否更新?", "Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
machine.Version = int.Parse(version);
db.SaveChanges();
//更新
string fileName = Application.StartupPath + @"\update.exe";
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = fileName;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = "";//参数以空格分隔,如果某个参数为空,可以传入””
p.Start();
System.Environment.Exit(System.Environment.ExitCode); //结束主线程
//string output = p.StandardOutput.ReadToEnd(); //this.Dispose();//关闭主程序
}
}
}
else
{
MessageBox.Show("请联系IT授权");
}
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 fl = new Form1();//此处应打开注册页
fl.ShowDialog();
}
结尾
该更新程序可以改为7z压缩下载后再解压的方式,可以免去文件列表和部分文件不好下载的问题,作者太忙没来得及去改(其实是比较懒。。。),如有哪位大佬修改完成请提供参考下。