本地措施在实际项目使用过程中,因为可以操纵电脑本地的一些信息,并且对付串口、OPC、并口等数据可以便利的进行收发,虽然此刻软件行业看着动不动都是互联网啊啥的,大有Web处事就是高大上的觉得,但是作为本地的应用还是有着非常重要的位置,出格是在制造业工厂里,车间里相关的措施。
抛开一切业务上的成果不谈,本地措施一直对照诟病的处所就是在于软件的更新上,由于措施都在客户端电脑上运行,当需要更新的时候,就不得不由专门的实施人员过去,部署更新,无形中增加项目本钱,SO,对付c/s措施的自动更新也是对照苦恼的问题,下面我就来稍微解析下,一个自动更新措施应该要怎么实现(PS:思路可能对照传统,欢迎大家拍砖供给更好的思路)
二、自动更新的存眷点
如图所示,对付一个自动更新措施,存眷点应该都是以上几个点
打点员权限,在win7以后,如果应用位置在C盘的话,每次操纵目录城市申请打点员权限,emmmm,所以这个必需要考虑
对付要实现一个较为通用的自动更新,应该要安置了.NetFrameWork的都要可以使用,并且便利使用
更新措施同时要只能启动一个,不然必定掉事儿,虽然很少有会有人去点2次,但是还是要考虑
界面要求上,更新说明以及进度条要显示
很多时候可能我们也是需要一个静默更新的操纵
运行更新的时候,记得要*运行的措施,不然必定更新掉败
对付更新掉败,得有完善的回滚以及备份机制
更新告成后,得可以启动对应的主措施
有些 时候措施部分信息是记录在注册内外,如果注册表要改削咋办呢,so,对付注册表也得要撑持
有些时候措施更新到后面,会呈现一些多余的DLL,这些DLL那也是要干失滴(虽然感受有点鸡肋)
概略就是以上的一些点,这些是我本身思考的时候罗列出来的,可能对照乱,大家大白就好
三、设计说明
更新措施主要流程如图所示,大的流程标的目的上是对照简单的,但是如果深入后,还是有部分会对照庞大
措施类的一些简单说明
config.update:注册表的增删法则以及文件的删除法则,如下法则所示
[regedit_del] //删除注册表 SOFTWARE\\XXX\\XXX,name [regedit_add]//新增注册表 SOFTWARE\\XXX\\XXXX,name=John Doe [file_del] //删除文件 hello.dll
Server.xml&RemoteInfo.cs:处事真个版本配置文件信息
Local.xml&LocalInfo.cs:客户真个版本配置文件信息
UpdateWork.cs:核心的更新要领,为了便利后续有界面定制化的需求,将更新相关的全部放在UpdateWork中,使用UpdateWork.Do要领就可以进行更新
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一些细节说明
1、如何让措施尽量的便利集成?
由于自动更新措施必需是要与主措施分隔的,所以我们要让主措施启动更新措施的时候,将主措施本身的信息带进去,这样才可以尽可能的做到通用
/// <summary>
/// 应用措施的主入口点。
/// <param>[0]措施名称,[1]静默更新 0:否 1:是</param>
/// </summary>
[STAThread]
static void Main(string[] args)
{
if (f)
{
try
{
if (String.IsNullOrEmpty(args[0]) == false)
{
UpdateWork updateWork = new UpdateWork(args[0]);
if (updateWork.UpdateVerList.Count > 0)
{
/* 当前用户是打点员的时候,直接启动应用措施
* 如果不是打点员,则使用启动东西启动措施,以确保使用打点员身份运行
*/
//获恰当前登录的Windows用户标示
System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
//创建Windows用户主题
Application.EnableVisualStyles();
System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
//判断当前登录用户是否为打点员
if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
{
if (args[1] == "1")
{
updateWork.Do();
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm(updateWork));
}
}
else
{
String result = Environment.GetEnvironmentVariable("systemdrive");
if (AppDomain.CurrentDomain.BaseDirectory.Contains(result))
{
//创建启动东西
ProcessStartInfo startInfo = new ProcessStartInfo
{
//设置运行文件
FileName = System.Windows.Forms.Application.ExecutablePath,
//设置启动行动,确保以打点员身份运行
Verb = "runas",
Arguments = " " + args[0] + " " + args[1]
};
//如果不是打点员,则启动UAC
System.Diagnostics.Process.Start(startInfo);
}
else
{
if (args[1] == "1")
{
updateWork.Do();
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm(updateWork));
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}