WinForm应用程序中实现自动更新功能

WinForm应用程序中实现自动更新功能

编写人:左丘文

2015-4-20

近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因程序的bug而带来频繁让用户更新程序的不良影响,就想给ECM增加一个winform自动更新功能,今天在这里,我想与大家一起分享代码,在此做个小结,以供参考。有兴趣的同学,可以一同探讨与学习一下,否则就略过吧。

 

1、 首先我们在这里先分析一下其它程序猿的一些基本情况:

相信有许多程序猿都喜欢用Winform做开发吧?!因为Winform相对Webform而言,优点是,功能更强大,编程更方便.但是它的缺点,就是软件的安装及维护是相当麻烦地,要实现软件更新,需要到客户端一台一台地升级。

长期以来,广大程序猿为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素。有很多企业用户就是因为这个原因而放弃使用C/S。然而当一个应用必须要使用C/S结构才能很好的实现其功能的时候,我们该如何解决客户端的部署与自动升级问题?部署很简单,只要点击安装程序即可,难的在于每当有新版本发布时,能够实现自动升级。现在好了,我们的目标很简单,我们希望开发一个与具体应用无关的能够复用的自动升级系统。下面我为大家提供了一套可复用的用C#实现在线升级。这里分为本地在线升级,也可以利用webservice 在线通过互联网与软件开商的服务器在线升级。

2、 实现软件自动在线升级的原理

1)         写三个程序,一个是主程序;两个是升级程序;所有升级任务都由升级程序完成

原本只需要一个升级程序,但在这里,由于我们另外还涉及到了,在线与软件供应商服务器更新功能,因此我们这里用到了一个主程序两个升级程序。

2)         很多人实行的原理是将现有版本与最新版本作比较,发现最新的则提示用户是否升级,当然也有人用其它属性比较的,例如:文件大小或者更新日期。我们这里主要利用FileUtil的两个属性SHA1File与MD5File来判断,与服务器之间是否存在版本差异,存在就更新。

3)         我们的程序,刚开始初始版本是我一同事利用了三天时间,大致写了一个框架出来,我是在他的基础上,对其进行了完善,如增加了对文件流的压缩与解压缩功能,方便进行网络的传输,增加了通过webservices的在线更新功能。并将程序做到通用功能,并嵌套到了我们的ECM系统中。

3、 软件更新操作界面:

1)   启动我们的主程序ECM

2)   系统会从数据库中检查是否有新版本,点点【否】会直接进入系统,点【是】系统会进入到更新介面:

先择需要更新的内容,点击更新,系统会自动更新相关程序。

3)   与软件供应商服务器在线更新介面:

操作类似于在线本地更新一样。

具体就需要各位好好的自已去调试了。

4、 更新程序的代码:

1)   我们的更新程序是以文件流的形式存放在数据库中,因此我们首先需要为系统数据库增加相关的表,用于存储更新文件。

--建立相关表

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[SysUpdate](

[ID] [int] IDENTITY(1,1) NOT NULL,

[FileName] [varchar](250) NULL,

[FileVersion] [varchar](50) NULL,

[FilePath] [varchar](250) NULL,

[FileData] [varbinary](max) NULL,

[FileSize] [varchar](250) NULL,

[FileDate] [varchar](250) NULL,

[FileType] [varchar](50) NULL,

[FilesHash] [varchar](max) NULL,

[FilesMD5] [varchar](max) NULL,

[UpdateBit] [bit] NULL,

[RegBit] [bit] NULL

) ON [PRIMARY]

GO

SET ANSI_PADDING OFF

--建立插入SP

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[Insert_UpdateFile] @filename varchar(250),@fileversion varchar(50),@filepath varchar(250),@filesize varchar(250),@filedate varchar(250),@filetype varchar(50),@fileshash varchar(250),@filesmd5 varchar(250),@file varbinary(Max)
as
insert into SysUpdate ([FileName],[FileVersion],[FilePath],[FileSize],[FileDate],[FileType],[UpdateBit],[RegBit],[FilesHash],[FilesMD5],[FileData])
select  @filename,@fileversion,@filepath,@filesize,@filedate,@filetype,1,0,@fileshash,@filesmd5,@file

2)   整体程序框架图如下:

3)   上传功能代码:

namespace SysUpdate
{
    public partial class frmSysUpdateUp : Form
    {
        private string updateUrl = string.Empty;
        private string tempUpdatePath = string.Empty;
        WinBase.Common W1 = new WinBase.Common();
      
        public frmSysUpdateUp()
        {
            InitializeComponent();
        }
        private void frmSysUpdateUp_Load(object sender, EventArgs e)
        {
            //数据库SysUpdate表 显示需要更新内容
            dgvList.ColumnCount = 9;
            dgvList.AutoGenerateColumns = false;
            DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert(0, newColumn);
            dgvList.Columns.Insert(10, newColumn1);
            dgvList.Columns.Insert(11, newColumn2);
            this.SetdgvListHeadText();
 
            string strSQL41 = "SELECT * FROM SysUpdate order by ID;";
            DataSet ds = W1.DS(strSQL41, "Sys");
            dgvList.DataSource = ds.Tables[0].DefaultView;
            this.DataBinding();
 
            dgvList.Columns[0].Frozen = true;
            dgvList.Columns[1].Frozen = true;
            dgvList.Columns[2].Frozen = true;
            dgvList.Columns[3].Frozen = true;
            //   dgvList.Columns[4].Frozen = true;
        }
 
        private void SetdgvListHeadText()
        {
            dgvList.Columns[0].HeaderText = "选择";
            dgvList.Columns[0].Width = 50;
            dgvList.Columns[1].HeaderText = "ID";
            dgvList.Columns[1].Width = 20;
            dgvList.Columns[1].ReadOnly = true;
            dgvList.Columns[2].HeaderText = "组件名";
            dgvList.Columns[2].Width = 120;
            dgvList.Columns[2].ReadOnly = true;
            dgvList.Columns[3].HeaderText = "版本号";
            dgvList.Columns[3].Width = 80;
            dgvList.Columns[3].ReadOnly = true;
 
            dgvList.Columns[4].HeaderText = "大小";
            dgvList.Columns[4].Width = 100;
            dgvList.Columns[4].ReadOnly = true;
            dgvList.Columns[5].HeaderText = "创建日期";
            dgvList.Columns[5].Width = 150;
            dgvList.Columns[5].ReadOnly = true;
            dgvList.Columns[6].HeaderText = "哈希值";
            dgvList.Columns[6].Width = 250;
            dgvList.Columns[6].ReadOnly = true;
            dgvList.Columns[7].HeaderText = "MD5值";
            dgvList.Columns[7].Width = 250;
            dgvList.Columns[7].ReadOnly = true;
            dgvList.Columns[8].HeaderText = "目录";
            dgvList.Columns[8].Width = 80;
            dgvList.Columns[8].ReadOnly = true;
            dgvList.Columns[9].HeaderText = "文件类型";
            dgvList.Columns[9].Width = 80;
            dgvList.Columns[9].ReadOnly = true;
            dgvList.Columns[10].HeaderText = "是否更新";
            dgvList.Columns[10].Width = 80;
           // dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[11].HeaderText = "是否需要注册";
            dgvList.Columns[11].Width = 110;
            //dgvList.Columns[11].ReadOnly = true;
        }
 
        private string Byte2String(byte[] arrByte)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in arrByte)
            {
                sb.Append(b > 15 ? Convert.ToString(b, 16) : ‘0‘ + Convert.ToString(b, 16));
            }
            return sb.ToString();
        }
        private void DataBinding()
        {
 
            // ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
          
            dgvList.Columns[0].DataPropertyName = "Check1";
            dgvList.Columns[1].DataPropertyName = "ID";
            dgvList.Columns[2].DataPropertyName = "FileName";
            dgvList.Columns[3].DataPropertyName = "FileVersion";
          
            dgvList.Columns[4].DataPropertyName = "FileSize";
            dgvList.Columns[5].DataPropertyName = "FileDate";
            dgvList.Columns[6].DataPropertyName = "FilesHash";
            dgvList.Columns[7].DataPropertyName = "FilesMD5";
            dgvList.Columns[8].DataPropertyName = "FilePath";
            dgvList.Columns[9].DataPropertyName = "FileType";
            dgvList.Columns[10].DataPropertyName = "UpdateBit";
            dgvList.Columns[11].DataPropertyName = "RegBit";
        }
 
        private void ListDate()
        {
            string strSQL41 = "SELECT * FROM SysUpdate order by ID ;";
            DataSet ds = W1.DS(strSQL41, "Sys");
            dgvList.DataSource = ds.Tables[0].DefaultView;
            this.DataBinding();
        }
 
        private void btnUpload_Click(object sender, EventArgs e)
        {
            txtFileText.Text = "";
            openFileDialog1.InitialDirectory = "d:\\";
            openFileDialog1.Filter = "文件(*.*)|*.*";
            openFileDialog1.FilterIndex = 1;
            openFileDialog1.RestoreDirectory = true;
            openFileDialog1.Multiselect = true;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                txtFileText.Text = openFileDialog1.FileName;
                //文件名称
                String S = System.IO.Path.GetFileName(openFileDialog1.FileName);
 
                //文件格式
                //  String FileType = System.IO.Path.GetExtension(openFileDialog1.FileName);
                string SHA1 = "";
                string md5 = "";
 
                SHA1 = FileUtil.SHA1File(txtFileText.Text.ToString());//这个消息摘要可以用来验证数据的完整性
                md5 = FileUtil.MD5File(txtFileText.Text.ToString());
 
                try
                {
                    if (FileUtil.IsInUse(txtFileText.Text.ToString()))
                    {
                        MessageBox.Show("文件已经使用中,无法上传!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
 
                    if (FileUtil.FileIsReadOnly(txtFileText.Text.ToString()))
                    {
                        FileUtil.SetFileReadonly(txtFileText.Text.ToString(), false);
                    }
                    FileStream fs = new FileStream(txtFileText.Text.ToString(), FileMode.Open);
                    int streamLength = (int)fs.Length;      //获取文件流的长度。  
                    byte[] image = new byte[streamLength];  //声明字节数组,用于保存图片文件  
                    fs.Read(image, 0, streamLength);        //把图片文件转换成为字节数组保存
                    fs.Close();
                    //文件版本号
                    FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(txtFileText.Text.ToString());
                    FileInfo file = new FileInfo(txtFileText.Text.ToString());
                  //  byte[] args0 = Common.SharpZip.CompressB(image);
                    byte[] args0 = Common.SharpZip.ICGzipCompress(image);
 
                    //创建文件流,path参数是文件路径  
                    string strSQL2 = "exec Insert_UpdateFile ‘" + S + "‘,‘" + fileVersion.FileVersion + "‘,‘‘,‘" + file.Length + "‘,‘" + file.CreationTime + "‘,‘" + file.Extension + "‘,‘" + SHA1 + "‘,‘" + md5 + "‘,0x" + Byte2String(args0) + "";
                    //string strSQL2 = "exec Insert_UpdateFile ‘" + S + "‘,‘" + fileVersion.FileVersion + "‘,‘‘,‘" + file.Length + "‘,‘" + file.CreationTime + "‘,‘" + file.Extension + "‘,‘" + SHA1 + "‘,‘" + md5 + "‘,0x" + Byte2String(image) + "";
 
                    int k = W1.DC(strSQL2, "Sys");
 
                   if (k>0)
                    {
                        MessageBox.Show("成功!", "成功提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("失败!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }          
 
                }
                catch
                {
 
                    MessageBox.Show("文件插入数据库失败!文件可能正在占用!!","错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
 
                ListDate();
 
            }
 
         
        }
 
        private void dgvList_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            txtID.Text = dgvList[1, e.RowIndex].Value.ToString();
            txtFilePath.Text = dgvList[8, e.RowIndex].Value.ToString();
            chkUpdateBit.Checked = Convert.ToBoolean(dgvList[10, e.RowIndex].Value);
            chkRegBit.Checked = Convert.ToBoolean(dgvList[11, e.RowIndex].Value);
        }
 
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
 
        }
 
        private void btnSave_Click(object sender, EventArgs e)
        {
 
            string strSQL2 = "Update SysUpdate set FilePath=‘" + txtFilePath.Text + "‘,UpdateBit=‘" + Convert.ToBoolean(chkUpdateBit.Checked) + "‘,RegBit=‘" + Convert.ToBoolean(chkRegBit.Checked) + "‘ where ID=‘" + txtID.Text + "‘;  ";
            int k = W1.DC(strSQL2, "Sys");
            if (k > 0)
            {
                MessageBox.Show("更新成功!", "成功提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("更新失败!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            ListDate();
 
        }
 
        private void btnDel_Click(object sender, EventArgs e)
        {
            string strSQL2 = "DELETE SysUpdate Where ID=‘" + txtID.Text + "‘;  ";
            int k = W1.DC(strSQL2, "Sys");
 
            if (k > 0)
            {
                MessageBox.Show("删除成功!", "成功提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("删除失败!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            ListDate();
        }
 
        private void dgvList_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int i = 0; i < this.dgvList.Rows.Count; )
            {
                this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue("config.xml", "Color", "IMColor"))); ;// pParentWin.globalcolor2;
                i += 2;
            }
        }
 
 
        ///<summary>
        /// 序列化
        /// </summary>
        /// <param name="data">要序列化的对象</param>
        /// <returns>返回存放序列化后的数据缓冲区</returns>
        public static byte[] Serialize(object data)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream rems = new MemoryStream();
            formatter.Serialize(rems, data);
            return rems.GetBuffer();
        }
 
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <param name="data">数据缓冲区</param>
        /// <returns>对象</returns>
        public static object Deserialize(byte[] data)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream rems = new MemoryStream(data);
            data = null;
            return formatter.Deserialize(rems);
        }
    }
}

4)   本地在线更新功能代码:

namespace SysUpdate
{
    public partial class frmLocalUpdate :Form
    {
 
     
        private string updateUrl = string.Empty;
        private string tempUpdatePath = string.Empty;
        WinBase.Common W1 = new WinBase.Common();
       // private ECM.frmMain pParentWin = null;
    
        bool isRun = false;
        bool isUpdate = false;
        string mainAppExe = "";
     
 
       // public frmLocalUpdate(ECM.frmMain WinMain)
         public frmLocalUpdate()
        {
            InitializeComponent();
           // pParentWin = WinMain;
        }
        private void FrmSysUpdate_Load(object sender, EventArgs e)
        {
            //数据库SysUpdate表 显示需要更新内容
            dgvList.ColumnCount = 10;
            dgvList.AutoGenerateColumns = false;
            DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert(0, newColumn);
            dgvList.Columns.Insert(11, newColumn1);
            dgvList.Columns.Insert(12, newColumn2);
            this.SetdgvListHeadText();
 
            string strSQL41 = "SELECT * FROM SysUpdate order by ID ;";
            DataSet ds = W1.DS(strSQL41,"Sys");
            dgvList.DataSource = ds.Tables[0].DefaultView;
            this.DataBinding();
 
            dgvList.Columns[0].Frozen = true;
            dgvList.Columns[1].Frozen = true;
            dgvList.Columns[2].Frozen = true;
            dgvList.Columns[3].Frozen = true;
            //   dgvList.Columns[4].Frozen = true;
            DataCheck();
 
        }
 
        private void SetdgvListHeadText()
        {
            dgvList.Columns[0].HeaderText = "选择";
            dgvList.Columns[0].Width = 50;
            dgvList.Columns[1].HeaderText = "ID";
            dgvList.Columns[1].Width = 20;
            dgvList.Columns[1].ReadOnly = true;
            dgvList.Columns[2].HeaderText = "组件名";
            dgvList.Columns[2].Width = 120;
            dgvList.Columns[2].ReadOnly = true;
            dgvList.Columns[3].HeaderText = "服务器版本号";
            dgvList.Columns[3].Width = 120;
            dgvList.Columns[3].ReadOnly = true;
 
            dgvList.Columns[4].HeaderText = "本地版本号";
            dgvList.Columns[4].Width = 120;
            dgvList.Columns[4].ReadOnly = true;
 
            dgvList.Columns[5].HeaderText = "大小";
            dgvList.Columns[5].Width = 100;
            dgvList.Columns[5].ReadOnly = true;
            dgvList.Columns[6].HeaderText = "创建日期";
            dgvList.Columns[6].Width = 150;
            dgvList.Columns[6].ReadOnly = true;
            dgvList.Columns[7].HeaderText = "哈希值";
            dgvList.Columns[7].Width = 250;
            dgvList.Columns[7].ReadOnly = true;
            dgvList.Columns[8].HeaderText = "MD5值";
            dgvList.Columns[8].Width = 250;
            dgvList.Columns[8].ReadOnly = true;
            dgvList.Columns[9].HeaderText = "目录";
            dgvList.Columns[9].Width = 80;
            dgvList.Columns[9].ReadOnly = true;
            dgvList.Columns[10].HeaderText = "文件类型";
            dgvList.Columns[10].Width = 80;
            dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[11].HeaderText = "是否更新";
            dgvList.Columns[11].Width = 80;
            // dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[12].HeaderText = "是否需要注册";
            dgvList.Columns[12].Width = 110;
            //dgvList.Columns[11].ReadOnly = true;
        }
 
 
        private void DataBinding()
        {
 
            // ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            dgvList.Columns[0].DataPropertyName = "Check1";
            dgvList.Columns[1].DataPropertyName = "ID";
            dgvList.Columns[2].DataPropertyName = "FileName";
            dgvList.Columns[3].DataPropertyName = "FileVersion";
 
            dgvList.Columns[5].DataPropertyName = "FileSize";
            dgvList.Columns[6].DataPropertyName = "FileDate";
            dgvList.Columns[7].DataPropertyName = "FilesHash";
            dgvList.Columns[8].DataPropertyName = "FilesMD5";
            dgvList.Columns[9].DataPropertyName = "FilePath";
            dgvList.Columns[10].DataPropertyName = "FileType";
            dgvList.Columns[11].DataPropertyName = "UpdateBit";
            dgvList.Columns[12].DataPropertyName = "RegBit";
        }
 
 
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
            // Application.ExitThread();
            // Application.Exit();
        }
 
        private void DataCheck()
        {
            //检查是否更新文件
            if (dgvList.Rows.Count != 0)
            {
                for (int i = 0; i < dgvList.Rows.Count; i++)
                {
                  string fileName = "";
                    string strg = "";
                    fileName = dgvList.Rows[i].Cells[2].Value.ToString();
                    strg = Application.StartupPath.ToString();//得到应用程序路径信息    
                    if (dgvList.Rows[i].Cells[9].Value.ToString() != "")
                    {
                        strg += "\\" + dgvList.Rows[i].Cells[9].Value.ToString();//添加路径信息
                    }
                    strg += "\\" + fileName;//添加文件名称
 
                    //检查文件是否存在
                    //文件版本号
                 
                   // FileInfo file = new FileInfo(strg);
                    if (FileUtil.IsExistFile(strg))
                    {
                        if ((FileUtil.MD5File(strg).ToString()) == (dgvList.Rows[i].Cells[8].Value.ToString()))
                        {
                            dgvList.Rows[i].Cells[0].Value = false;
                          
                        }
                        else
                        {
                            dgvList.Rows[i].Cells[0].Value = true;
                        }
                        FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(strg);
                        dgvList.Rows[i].Cells[4].Value = fileVersion.FileVersion;
                    }
                    else
                    {
                        dgvList.Rows[i].Cells[0].Value = true;
                        dgvList.Rows[i].Cells[4].Value = "文件不存在";
                    }
                  
                }
            }
        }
 
 
    
 
        private delegate void SetProgressVlue(int value);
        private void SetValue(int value) //执行2次,第一次IF,第2次ELSE
        {
            if (this.InvokeRequired) //是否处于控件线程外
            {
                SetProgressVlue d = new SetProgressVlue(SetValue); //创建一个SetProgressVlue的委托实例d,并将SetVlue赋值
 
                object arg = value; //给参数的值
                this.Invoke(d, arg); //将该值传递给D
            }
            else
            {
                this.pbDownFile.Value += value;
            }
        }
 
 
 
        private void btnNext_Click(object sender, EventArgs e)
        {
             if (dgvList.Rows.Count == 0)
             {
                  MessageBox.Show("没有可用的更新!", "自动更新", MessageBoxButtons.OK, MessageBoxIcon.Information);
                  return;
             }
             for (int i = 0; i < dgvList.Rows.Count; i++)
             {
                 if (dgvList.Rows[i].Cells[0].Value == null)  //第一次都是null
                 {
                     dgvList.Rows[i].Cells[0].Value = false;
 
                 }
                 if ((dgvList.Rows[i].Cells[0].Value.ToString()) == "True")
                 {
                     isUpdate = true;
                 }
             }
             if (isUpdate==false)     
             {
                 MessageBox.Show("没有可用的更新!", "自动更新", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 return;
             }
            this.pbDownFile.Value = 0;
            string strSQL41 = "SELECT * FROM SysUpdate where UpdateBit=1 order by ID;";
            DataSet ds = W1.DS(strSQL41,"Sys");
            //检查目录对应文件MD5是否一样,
            //如果一样表示已经更新无需更新
            if (ds.Tables[0].Rows.Count >= 1)
            {
                pbDownFile.Maximum = ds.Tables[0].Rows.Count;
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    SetValue(1);
                    string fileName = "";
                    string strg = "";
                    fileName = ds.Tables[0].Rows[i]["FileName"].ToString();
                    strg = Application.StartupPath.ToString();//得到应用程序路径信息    
                    if (ds.Tables[0].Rows[i]["FilePath"].ToString() != "")
                    {
                        strg += "\\" + ds.Tables[0].Rows[i]["FilePath"].ToString();//添加路径信息
                    }
                    strg += "\\" + fileName;//添加文件名称
 
                    //检查文件是否存在
                    if (FileUtil.IsExistFile(strg))
                    {
                        if ((FileUtil.MD5File(strg).ToString()) == (ds.Tables[0].Rows[i]["FilesMD5"].ToString()))
                        {
 
                        }
                        else
                        {
                            CloseMainExe();
                            //删除当前文件
                            FileUtil.DeleteFile(strg);
                            byte[] MyData2 = new byte[0];
                            MyData2 = (byte[])ds.Tables[0].Rows[i]["FileData"];
                            byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);//解压
                            //MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2));//解压
                            FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                            fs.Write(args0, 0, args0.Length);
                            fs.Close();
                            //是否注册
                            if (ds.Tables[0].Rows[i]["RegBit"].ToString() == "True")
                            {
                                Process p = new Process();
                                p.StartInfo.FileName = "Regsvr32.exe";
                                p.StartInfo.Arguments = "/s " + strg;//
                            }
 
 
                        }
                    }
                    else
                    {
 
                        string DirectoryStrg = Application.StartupPath.ToString();//得到应用程序路径信息    
                        if (ds.Tables[0].Rows[i]["FilePath"].ToString() != "")
                        {
                            DirectoryStrg += "\\" + ds.Tables[0].Rows[i]["FilePath"].ToString();//添加路径信息
                        }
 
                        if (DirectoryUtil.IsExistDirectory(DirectoryStrg))
                        {
                        }
                        else
                        {
                            DirectoryUtil.CreateDirectory(DirectoryStrg);
                        }
 
                        byte[] MyData2 = new byte[0];
                        MyData2 = (byte[])ds.Tables[0].Rows[i]["FileData"];
                        byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);
                       // MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2));//解压
                        FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                        fs.Write(args0, 0, args0.Length);
                        fs.Close();
 
                        if (ds.Tables[0].Rows[i]["RegBit"].ToString() == "True")
                        {
                            Process p = new Process();
                            p.StartInfo.FileName = "Regsvr32.exe";
                            p.StartInfo.Arguments = "/s " + strg;//
                        }
 
                    }
 
                }
                DataCheck();
                panel2.Location = panel1.Location;
                panel2.Size = panel1.Size;
                panel1.Visible = false;
                panel2.Visible = true;
                btnNext.Visible = false;
                StarMainExe();
                Application.Exit();
            }
 
        }
 
        private void CloseMainExe()
        {
            try
            {
                string localXmlFile = Application.StartupPath + "\\UpdateList.xml";
                isRun = W1.LoadXmlFileValue("UpdateList.xml", "Application", "AllowStart").ToLower() == "true" ? true : isRun;
                mainAppExe = W1.LoadXmlFileValue("UpdateList.xml", "Application", "AppName");
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace(".exe", ""));
                for (int i = 0; i < processesByName.Length; i++)
                {
                    Process p = processesByName[i];
                    for (int j = 0; j < p.Threads.Count; j++)
                    {
                        p.Threads[j].Dispose();
                    }
                    p.Kill();
                    if (i == processesByName.Length - 1) Thread.Sleep(550);
 
                }
 
            }
            catch
            {
                MessageBox.Show("关闭运行中的进程发生错误,请联系管理员!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            //finally
            //{
            //    this.Close();
            //    this.Dispose();
            //    //  Application.ExitThread();
            //    //  Application.Exit();
            //}
        }
 
        private void StarMainExe()
        {
            try
            {
                string localXmlFile = Application.StartupPath + "\\UpdateList.xml";
                isRun = false;
                mainAppExe = W1.LoadXmlFileValue("UpdateList.xml", "Application", "AppName");
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace(".exe", ""));
                for (int i = 0; i < processesByName.Length; i++)
                {
                  if (processesByName[i].ToString().ToLower() == mainAppExe.ToString().ToLower())
                  {
                      isRun = true;
                      break;
                  }
 
                }
 
                if (false == this.isRun) Process.Start(mainAppExe);
 
            }
            catch
            {
                MessageBox.Show("重启主程序发生错误,请联系管理员!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.Close();
                this.Dispose();
                //  Application.ExitThread();
                //  Application.Exit();
            }
 
        }
        private void dgvList_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int i = 0; i < this.dgvList.Rows.Count; )
            {
                this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue("config.xml", "Color", "IMColor"))); ;// pParentWin.globalcolor2;
                i += 2;
            }
        }
      
 
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            string strSQL41 = "SELECT * FROM SysUpdate order by ID ;";
            DataSet ds = W1.DS(strSQL41,"Sys");
            dgvList.DataSource = ds.Tables[0].DefaultView;
            this.DataBinding();
            DataCheck();
        }
 
     
        private SysUpdate.frmSysUpdateUp frmsysupdateup = null;
        private void OpenUpload()
        {
            if (FindFormName("frmSysUpdateUp") == null)
            {
                frmsysupdateup = new SysUpdate.frmSysUpdateUp(); ;
                frmsysupdateup.Show();
                frmsysupdateup.Focus();
            }
            else
            {
                Form f = FindFormName("frmSysUpdateUp") as Form;
                f.Focus();
            }
        }
        /// <summary>在OpenForms中查找已经打开的窗口 </summary>     
        /// <param name="text">传入的窗口名称</param>      
        /// <returns>返回的窗口</returns>   
        private Form FindFormName(string name)
        {
            foreach (Form form in Application.OpenForms)
                //窗口名称
                if (form.Name == name)
                    return form;
            return null;
        }
 
      
        private void frmLocalUpdate_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((Control.ModifierKeys & Keys.Control) == Keys.Control && e.KeyChar==19)
            {
                OpenUpload();
            }
        }
        //protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        //{
        //    if ((keyData & Keys.Alt) == Keys.Alt)//检测到alt
        //    {
        //        if ((keyData & Keys.Control) == Keys.Control)
        //        {
        //            System.Windows.Forms.SendKeys.Send("^%");
        //            return true;
        //        }
        //    }
        //    return base.ProcessCmdKey(ref msg, keyData);
        //}
    
 
 
    }
}

5)   通过webservice在线更新功能代码:

namespace SysUpdate
{
    public partial class frmOnlineUpdate : Form
    {
 
      
        private string updateUrl = string.Empty;
        private string tempUpdatePath = string.Empty;
        WinBase.Common W1 = new WinBase.Common();
      
        DataSet ds1 = new DataSet();
        bool isRun = false;
        bool isUpdate = false;
        string mainAppExe = "";
      
 
        public frmOnlineUpdate()
        {
            InitializeComponent();
          
        }
        private void frmOnlineUpdate_Load(object sender, EventArgs e)
        {
            //数据库SysUpdate表 显示需要更新内容
            dgvList.ColumnCount = 10;
            dgvList.AutoGenerateColumns = false;
            DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert(0, newColumn);
            dgvList.Columns.Insert(11, newColumn1);
            dgvList.Columns.Insert(12, newColumn2);
            this.SetdgvListHeadText();
 
 
 
            string localXmlFile = Application.StartupPath + "\\UpdateList.xml";
            txtAddress.Text = W1.LoadXmlFileValue("UpdateList.xml", "Updater", "Url");          
            Down();
            dgvList.DataSource = ds1.Tables[0].DefaultView;
            this.DataBinding();
 
            dgvList.Columns[0].Frozen = true;
            dgvList.Columns[1].Frozen = true;
            dgvList.Columns[2].Frozen = true;
            dgvList.Columns[3].Frozen = true;
            //   dgvList.Columns[4].Frozen = true;
            DataCheck();
 
        }
        private void Down()
        {
            string url = txtAddress.Text;
            #region 从服务器获取更新列表
 
            object result = WebServicesHelper.InvokeWebService(url, "GetUpdateFile", null);
            byte[] tb = (byte[])result;
            object[] ob = Common.SharpZip.DecompressNew(tb);
            DataTable[] tb2 = (DataTable[])ob;
 
            for (int i = 0; i < tb2.Length; i++)
            {
                ds1.Tables.Add(tb2[i]);
            }
            #endregion
        }
           
 
          private void SetdgvListHeadText()
        {
            dgvList.Columns[0].HeaderText = "选择";
            dgvList.Columns[0].Width = 50;
            dgvList.Columns[1].HeaderText = "ID";
            dgvList.Columns[1].Width = 20;
            dgvList.Columns[1].ReadOnly = true;
            dgvList.Columns[2].HeaderText = "组件名";
            dgvList.Columns[2].Width = 120;
            dgvList.Columns[2].ReadOnly = true;
            dgvList.Columns[3].HeaderText = "服务器版本号";
            dgvList.Columns[3].Width = 120;
            dgvList.Columns[3].ReadOnly = true;
 
            dgvList.Columns[4].HeaderText = "本地版本号";
            dgvList.Columns[4].Width = 120;
            dgvList.Columns[4].ReadOnly = true;
 
            dgvList.Columns[5].HeaderText = "大小";
            dgvList.Columns[5].Width = 100;
            dgvList.Columns[5].ReadOnly = true;
            dgvList.Columns[6].HeaderText = "创建日期";
            dgvList.Columns[6].Width = 150;
            dgvList.Columns[6].ReadOnly = true;
            dgvList.Columns[7].HeaderText = "哈希值";
            dgvList.Columns[7].Width = 250;
            dgvList.Columns[7].ReadOnly = true;
            dgvList.Columns[8].HeaderText = "MD5值";
            dgvList.Columns[8].Width = 250;
            dgvList.Columns[8].ReadOnly = true;
            dgvList.Columns[9].HeaderText = "目录";
            dgvList.Columns[9].Width = 80;
            dgvList.Columns[9].ReadOnly = true;
            dgvList.Columns[10].HeaderText = "文件类型";
            dgvList.Columns[10].Width = 80;
            dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[11].HeaderText = "是否更新";
            dgvList.Columns[11].Width = 80;
            // dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[12].HeaderText = "是否需要注册";
            dgvList.Columns[12].Width = 110;
            //dgvList.Columns[11].ReadOnly = true;
        }
 
 
        private void DataBinding()
        {
 
            // ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            dgvList.Columns[0].DataPropertyName = "Check1";
            dgvList.Columns[1].DataPropertyName = "ID";
            dgvList.Columns[2].DataPropertyName = "FileName";
            dgvList.Columns[3].DataPropertyName = "FileVersion";
 
            dgvList.Columns[5].DataPropertyName = "FileSize";
            dgvList.Columns[6].DataPropertyName = "FileDate";
            dgvList.Columns[7].DataPropertyName = "FilesHash";
            dgvList.Columns[8].DataPropertyName = "FilesMD5";
            dgvList.Columns[9].DataPropertyName = "FilePath";
            dgvList.Columns[10].DataPropertyName = "FileType";
            dgvList.Columns[11].DataPropertyName = "UpdateBit";
            dgvList.Columns[12].DataPropertyName = "RegBit";
        }
 
 
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
            // Application.ExitThread();
            // Application.Exit();
        }
 
        private void DataCheck()
        {
            //检查是否更新文件
            if (dgvList.Rows.Count != 0)
            {
                for (int i = 0; i < dgvList.Rows.Count; i++)
                {
                  string fileName = "";
                    string strg = "";
                    fileName = dgvList.Rows[i].Cells[2].Value.ToString();
                    strg = Application.StartupPath.ToString();//得到应用程序路径信息    
                    if (dgvList.Rows[i].Cells[9].Value.ToString() != "")
                    {
                        strg += "\\" + dgvList.Rows[i].Cells[9].Value.ToString();//添加路径信息
                    }
                    strg += "\\" + fileName;//添加文件名称
 
                    //检查文件是否存在
                    //文件版本号
                 
                   // FileInfo file = new FileInfo(strg);
                    if (FileUtil.IsExistFile(strg))
                    {
                        if ((FileUtil.MD5File(strg).ToString()) == (dgvList.Rows[i].Cells[8].Value.ToString()))
                        {
                            dgvList.Rows[i].Cells[0].Value = false;
                           
                        }
                        else
                        {
                            dgvList.Rows[i].Cells[0].Value = true;
                        }
                        FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(strg);
                        dgvList.Rows[i].Cells[4].Value = fileVersion.FileVersion;
                    }
                    else
                    {
                        dgvList.Rows[i].Cells[0].Value = true;
                        dgvList.Rows[i].Cells[4].Value = "文件不存在";
                    }
                  
                }
            }
        }
 
 
    
 
        private delegate void SetProgressVlue(int value);
        private void SetValue(int value) //执行2次,第一次IF,第2次ELSE
        {
            if (this.InvokeRequired) //是否处于控件线程外
            {
                SetProgressVlue d = new SetProgressVlue(SetValue); //创建一个SetProgressVlue的委托实例d,并将SetVlue赋值
 
                object arg = value; //给参数的值
                this.Invoke(d, arg); //将该值传递给D
            }
            else
            {
                this.pbDownFile.Value += value;
            }
        }
 
 
 
        private void btnNext_Click(object sender, EventArgs e)
        {
             if (dgvList.Rows.Count == 0)
             {
                  MessageBox.Show("没有可用的更新!", "自动更新", MessageBoxButtons.OK, MessageBoxIcon.Information);
                  return;
             }
             for (int i = 0; i < dgvList.Rows.Count; i++)
             {
                 if (dgvList.Rows[i].Cells[0].Value == null)  //第一次都是null
                 {
                     dgvList.Rows[i].Cells[0].Value = false;
 
                 }
                 if ((dgvList.Rows[i].Cells[0].Value.ToString()) == "True")
                 {
                     isUpdate = true;
                 }
             }
             if (isUpdate==false)     
             {
                 MessageBox.Show("没有可用的更新!", "自动更新", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 return;
             }
            this.pbDownFile.Value = 0;
            string strSQL41 = "SELECT * FROM SysUpdate where UpdateBit=1 order by ID;";
            DataSet ds = W1.DS(strSQL41,"Sys");
            //检查目录对应文件MD5是否一样,
            //如果一样表示已经更新无需更新
            if (ds.Tables[0].Rows.Count >= 1)
            {
                pbDownFile.Maximum = ds.Tables[0].Rows.Count;
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    SetValue(1);
                    string fileName = "";
                    string strg = "";
                    fileName = ds.Tables[0].Rows[i]["FileName"].ToString();
                    strg = Application.StartupPath.ToString();//得到应用程序路径信息    
                    if (ds.Tables[0].Rows[i]["FilePath"].ToString() != "")
                    {
                        strg += "\\" + ds.Tables[0].Rows[i]["FilePath"].ToString();//添加路径信息
                    }
                    strg += "\\" + fileName;//添加文件名称
                  
                    //检查文件是否存在
                    if (FileUtil.IsExistFile(strg))
                    {
                        if ((FileUtil.MD5File(strg).ToString()) == (ds.Tables[0].Rows[i]["FilesMD5"].ToString()))
                        {
 
                        }
                        else
                        {
                            CloseMainExe();
                            //删除当前文件
                            FileUtil.DeleteFile(strg);
                            byte[] MyData2 = new byte[0];
                            MyData2 = (byte[])ds.Tables[0].Rows[i]["FileData"];
                            byte[] args0 = Common.SharpZip.DecompressB(MyData2);//解压
                            //MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2));//解压
                            FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                            fs.Write(args0, 0, args0.Length);
                            fs.Close();
                            //是否注册
                            if (ds.Tables[0].Rows[i]["RegBit"].ToString() == "True")
                            {
                                Process p = new Process();
                                p.StartInfo.FileName = "Regsvr32.exe";
                                p.StartInfo.Arguments = "/s " + strg;//
                            }
 
 
                        }
                    }
                    else
                    {
 
                        string DirectoryStrg = Application.StartupPath.ToString();//得到应用程序路径信息    
                        if (ds.Tables[0].Rows[i]["FilePath"].ToString() != "")
                        {
                            DirectoryStrg += "\\" + ds.Tables[0].Rows[i]["FilePath"].ToString();//添加路径信息
                        }
 
                        if (DirectoryUtil.IsExistDirectory(DirectoryStrg))
                        {
                        }
                        else
                        {
                            DirectoryUtil.CreateDirectory(DirectoryStrg);
                        }
 
                        byte[] MyData2 = new byte[0];
                        MyData2 = (byte[])ds.Tables[0].Rows[i]["FileData"];
                        byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);
                       // MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2));//解压
                        FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                        fs.Write(args0, 0, args0.Length);
                        fs.Close();
 
                        if (ds.Tables[0].Rows[i]["RegBit"].ToString() == "True")
                        {
                            Process p = new Process();
                            p.StartInfo.FileName = "Regsvr32.exe";
                            p.StartInfo.Arguments = "/s " + strg;//
                        }
                       
                    }
 
                }
                DataCheck();
                panel2.Location = panel1.Location;
                panel2.Size = panel1.Size;
                panel1.Visible = false;
                panel2.Visible = true;
                btnNext.Visible = false;
                StarMainExe();
                Application.Exit();
            }
 
        }
 
        private void CloseMainExe()
        {
            try
            {
                string localXmlFile = Application.StartupPath + "\\UpdateList.xml";
                isRun = W1.LoadXmlFileValue("UpdateList.xml", "Application", "AllowStart").ToLower() == "true" ? true : isRun;
                mainAppExe = W1.LoadXmlFileValue("UpdateList.xml", "Application", "AppName");
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace(".exe", ""));
                for (int i = 0; i < processesByName.Length; i++)
                {
                    Process p = processesByName[i];
                    for (int j = 0; j < p.Threads.Count; j++)
                    {
                        p.Threads[j].Dispose();
                    }
                    p.Kill();
                    if (i == processesByName.Length - 1) Thread.Sleep(550);
 
                }
              
            }
            catch
            {
                MessageBox.Show("关闭运行中的进程发生错误,请联系管理员!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            //finally
            //{
            //    this.Close();
            //    this.Dispose();
            //  //  Application.ExitThread();
            //  //  Application.Exit();
            //}
        }
 
        private void StarMainExe()
        {
            try
            {
                string localXmlFile = Application.StartupPath + "\\UpdateList.xml";
                isRun = false;
                mainAppExe = W1.LoadXmlFileValue("UpdateList.xml", "Application", "AppName");
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace(".exe", ""));
                for (int i = 0; i < processesByName.Length; i++)
                {
                    if (processesByName[i].ToString().ToLower() == mainAppExe.ToString().ToLower())
                    {
                        isRun = true;
                        break;
                    }
 
                }
 
                if (true == this.isRun) Process.Start(mainAppExe);
 
            }
            catch
            {
                MessageBox.Show("重启主程序发生错误,请联系管理员!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.Close();
                this.Dispose();
                //  Application.ExitThread();
                //  Application.Exit();
            }
 
        }
 
        private void dgvList_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int i = 0; i < this.dgvList.Rows.Count; )
            {
                this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue("config.xml", "Color", "IMColor"))); ;// pParentWin.globalcolor2;//System.Drawing.Color.FromArgb(Convert.ToInt32(-2302756));//
                i += 2;
            }
        }
      
 
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            Down();
            dgvList.DataSource = ds1.Tables[0].DefaultView;
            this.DataBinding();
            DataCheck();
        }
      
 
 
    }
}

6)   软件商webserice代码

namespace HostWebService
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
   // [WebService(Namespace = "http://tempuri.org/")]
    [WebService(Namespace = "http://localhost/sysupdate/SysUpdate.asmx/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]

public class HostService : System.Web.Services.WebService
    {
        WebBase W1 = new WebBase();
        #region WebService Get Method
        
       
        [WebMethod(Description = "取得服务器上的相关更新资料DataSet")]
        public byte[] GetUpdateFile()
        {
            string strSQL = "SELECT * FROM SysUpdate where UpdateBit=1 order by ID;";
            DataSet ds = W1.DS(strSQL, "Sys");
            DataTable[] tb = new DataTable[ds.Tables.Count];
            for (int i = 0; i < ds.Tables.Count; i++)
            {
                tb[i] = ds.Tables[i];

}
            return Common.SharpZip.Compress(tb);
        }
      
       
        #endregion

#region WebService Post Method
      
        [WebMethod(Description = "更新相关文件")]
        public int UploadUpdateFile(byte[] result)
        {
            int id = 0;
            byte[] tb = (byte[])result;
            object[] ob = Common.SharpZip.DecompressNew(tb);
            DataTable[] tb2 = (DataTable[])ob;
            DataSet ds1 = new DataSet();
            for (int i = 0; i < tb2.Length; i++)
            {
                ds1.Tables.Add(tb2[i]);
            }

if (ds1.Tables[0].Rows.Count > 0)
            {

for (int i = 0; i < ds1.Tables[0].Rows.Count; i++)
                {
                    string strSQL = "select * from SysUpdate where ID=‘" + ds1.Tables[0].Rows[i][0].ToString() + "‘";
                    DataSet ds10 = W1.DS(strSQL, "Sys");
                    if (ds10.Tables[0].Rows.Count > 0) //记录已存在时
                    {
                        strSQL = "Delete from SysUpdate where ID=‘" + ds1.Tables[0].Rows[i][0].ToString() + "‘; Insert into SysUpdate values(";
                        for (int j = 0; j < ds1.Tables[0].Columns.Count - 1; j++)
                        {
                            if (ds1.Tables[0].Columns[j].DataType.ToString() == "System.Double" || ds1.Tables[0].Columns[j].DataType.ToString() == "System.Decimal")  //Double型的要特别处理,不能看成字符型
                            {
                                if (ds1.Tables[0].Rows[i][j].ToString() == "")
                                {

strSQL += "null" + ",";
                                }
                                else
                                {
                                    strSQL += ds1.Tables[0].Rows[i][j].ToString() + ",";
                                }
                            }
                            else
                            {
                                strSQL += "‘" + ds1.Tables[0].Rows[i][j].ToString() + "‘,";
                            }
                        }
                        strSQL += "‘" + ds1.Tables[0].Rows[i][ds1.Tables[0].Columns.Count - 1].ToString() + "‘)";
                        try
                        {
                            W1.DC(strSQL, "Sys");
                            id++;

}
                        catch
                        {
                            return id = -1;
                        }
                    }
                    else
                    {
                        strSQL = " Insert into SysUpdate values(";
                        for (int j = 0; j < ds1.Tables[0].Columns.Count - 1; j++)
                        {
                            if (ds1.Tables[0].Columns[j].DataType.ToString() == "System.Double" || ds1.Tables[0].Columns[j].DataType.ToString() == "System.Decimal")  //Double型的要特别处理,不能看成字符型
                            {
                                if (ds1.Tables[0].Rows[i][j].ToString() == "")
                                {

strSQL += "null" + ",";
                                }
                                else
                                {
                                    strSQL += ds1.Tables[0].Rows[i][j].ToString() + ",";
                                }
                            }
                            else
                            {
                                strSQL += "‘" + ds1.Tables[0].Rows[i][j].ToString() + "‘,";
                            }
                        }
                        strSQL += "‘" + ds1.Tables[0].Rows[i][ds1.Tables[0].Columns.Count - 1].ToString() + "‘)";
                        try
                        {
                            W1.DC(strSQL, "Sys");
                            id++;

}
                        catch
                        {
                            return id = -1;
                        }
                    }
                }

}

return id;
        }
      
     
        #endregion

private void InitializeComponent()
        {
        }
       
    }
}

7)   更新配置文件:UpdateList.xml

<?xml version="1.0" encoding="gb2312"?>
<Configs>
  <Updater>
    <Url>http://218.X.X.2/sysupdate/HostService.asmx</Url> //升级文件所在服务器端的网址  
  </Updater>
  <Application>
    <AllowStart>true</AllowStart> //允许重新启动应用程序
    <AppName>ECM.exe</AppName>  //启动的应用程序名  
  </Application>
</Configs>

8)   ECM系统Login时检查是否有更新档功能代码:

private void CheckUpdate()
        {
             string strSQL41 = "SELECT * FROM SysUpdate where UpdateBit=1 order by ID;";
             DataSet ds = W1.DS(strSQL41,"Sys");
            //检查目录对应文件MD5是否一样,
            //如果一样表示已经更新无需更新
             if (ds.Tables[0].Rows.Count >= 1)
             {
                 for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                 {
 
                     string fileName = "";
                     string strg = "";
                     fileName = ds.Tables[0].Rows[i]["FileName"].ToString();
                     strg = Application.StartupPath.ToString();//得到应用程序路径信息   
                     if (ds.Tables[0].Rows[i]["FilePath"].ToString() != "")
                     {
                         strg += "\\" + ds.Tables[0].Rows[i]["FilePath"].ToString();//添加路径信息
                     }
                     strg += "\\" + fileName;//添加文件名称
 
                     //检查文件是否存在
                     if (SysUpdate.FileUtil.IsExistFile(strg))
                     {
                         if ((SysUpdate.FileUtil.MD5File(strg).ToString()) == (ds.Tables[0].Rows[i]["FilesMD5"].ToString()))
                         {
                         }
                         else
                         {
                             isUpdate = true;
 
                         }
                     }
                     else
                     {
                         isUpdate = true;
                     }
 
                 }
             }
             if (isUpdate)
             {
                 if (MessageBox.Show("服务器存在更新版本,是否更新为最新版", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                 {
                     System.Diagnostics.Process.Start("SysUpdate.exe");
                 }
             }
        }

5、 有关更多的技术分享,大家可以加入我们的技术群,进行源码的分享。

欢迎加入技术分享群:238916811

时间: 2024-10-14 21:48:49

WinForm应用程序中实现自动更新功能的相关文章

使用Azure Functions 在web 应用中启用自动更新(一)分析基于轮询的 Web 应用的限制

1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vistual Studio 在 Azure 上的部署 ”Azure Functions“应用. 接着上一篇,本篇介绍在 “Azure Functions” 中实现一个函数,该函数仅在 Azure Cosmos DB 中的数据发生变化时运行. 在基于计时器的轮询原型中,无论底层数据是否发生了更改,客户端应用程序都会联

Android应用自动更新功能的实现!!!

自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语:最新版本的url等).然后我们给出提示框,用户点击开始下载,下载完成开始覆盖安装程序,这样用户的应用就保持最新的拉. 为了让大家容易理解,我像往常一样准备一个小例子,这里为了方便我就省去了和后台交互部分了.步骤分别如下: 第一步:新建一个Android工程命名为:UpdateDemo.代码结构如下图所示: 第二步:新建一个UpdateMana

JavaFX本地应用自动更新功能的实现FXLauncher

JavaFX本地应用自动更新功能的实现--FXLauncher 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一.Javapackager介绍 JavaFX已经成为构建现代桌面应用最好的UI框架之一,但是它一直存在部署不方便的问题.Javapackager工具就是针对这个问题的解决方案,正如同JavaFX已经打包进JDK 8中,Javapackager工具也随同JDK 8一同提供. Javapackager工具使得

简单实现安卓app自动更新功能

一般的安卓app都有自动更新功能,实现app的更新,以让用户体验新版本的功能,这里也是项目中用到的,今天就来总结一下,代码应该有点多,还请耐心点哈. 安卓应用实现自动更新比较简单,这里跟大家介绍下: 第一步 服务器端: 服务端提供一个借口,或者网址,我这里就用的服务器是tomcat,这里提供一个网址如下: //也就是一个json数据接口 public static final String UPDATE_URL = "http://192.168.1.103:8080/update.json&q

JavaFX本地应用自动更新功能的实现——FXLauncher

看了官方的demo,还是研究了好久才实现了此功能.描述实在是太简单了. 参考地址:fxldemo    fxlauncher  JavaFX本地应用自动更新功能的实现--FXLauncher 在看了那些参考资料后,感觉还是无从下手.资料上说主要是以下几个步骤: 1.FXLauncher的使用步骤 1)编译项目JAR到app.dir 2)复制依赖包到app.dir 3)生成app.xml manifest 4)创建本地安装器 5)上传artifact到自动更新仓库 没有具体的步骤,只能研究fxld

VFP开发的C/S模式的程序如何实现自动升级功能

最近用VFP开发了一个C/S模式的信息管理系统,由于公司有自己的VPN网路,系统的用户遍布国内外,所以急需要开发一个实现自动升级功能,这样我就可以随时发布信息的补丁包和新开发的功能了. 具体代码要结合程序. 一般这样: 程序A.EXE 和 程序B.EXE (为直正的程序) 1.由 程序A.EXE 连接数据库 2.由 程序A.EXE 取得数据库中 程序B.EXE 的版本(这个版本是在将最新的 程序B.EXE 写入数据库时一同写入的) 3.由 程序A.EXE 取得 程序B.EXE 的版本,如果本地

在WinForm应用程序中快速实现多语言的处理(2)--开发框架模块的整合

我在上篇随笔<在WinForm应用程序中快速实现多语言的处理>里面介绍了Winform开发中多语言的处理解决方案,整个多语言解决方案是以实际需求为驱动,以减少代码改动,高效处理为目的,通过基类继承的方式减少代码修改,通过引入翻译API方式减少翻译处理时间,本随笔继续深化这个多语言处理方案的介绍,是指整合在开发框架中进行无缝的使用. 1.多语言的处理步骤 1)提取多语言处理JSON文件 我们通过把程序界面或者代码里面的中文提取出来,放到JSON文件中,对不同模块可以分为不同的JSON文件,如下所

CleanAOP实战系列--WPF中MVVM自动更新

CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: [email protected] QQ: 511363759 CleanAOP介绍:https://github.com/Jarvin-Guan/CleanAOP 前言 讲起WPF,开发模式MVVM是必不可少的,使用MVVM模式以后可以在View中写界面,需要使用到的数据则使用绑定的方式写到标签中,那么控制权就放到了ViewModel中,那么有一个需求是每一个使用MVVM者都会有的,就是在后台改变ViewModel的属

Android应用自动更新功能的代码实现

由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必要给我们的Android应用增加自动更新的功能. 既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件,存放软件的版本信息: <update> <version>2</version> <name>baidu