关于CS模式客户端自动更新问题

时间:2022-12-02 08:34:07
当客户端启动时,自动到服务器上检测最新版本。如果有最新版本就把最新版本下载到客户端服务器上,当下载完时,客户端正在执行目前的进程,如果才能覆盖呢?

33 个解决方案

#1


能不能 这样, 客户端 先由 管理程序启动,管理程序 判断已经下载了更新 就覆盖 客户端,但是不用覆盖自己, 然后 再启动客户端。 这样 更新下载完后 重启就ok了

#2


引用 1 楼 jingshuaizhjason 的回复:
能不能 这样, 客户端 先由 管理程序启动,管理程序 判断已经下载了更新 就覆盖 客户端,但是不用覆盖自己, 然后 再启动客户端。 这样 更新下载完后 重启就ok了


管理程序启动 也调用该进程了,下载后不能更新。该进程启动时不能覆盖更新的。

#3


启动exe的时候检查版本
没有就直接丢个进度框出来,把新的exe下载到临时目录,下载完了说要重启应用程序,结束exe的时候加个事件去调个拷贝脚本,脚本里跑ntsd -c q -pn xxx.exe把你的exe全干掉(如果还有的话),完了把新的exe拷过去

#5


我现在刚接手一个软件,里面有个自动更新,就是自动从ftp服务器上检测最新版本,然后下载下来安装;
现在碰到的问题就是被防火墙当做病毒,每次自动更新防火墙都会报警;

所以准备重写,我也不太会,来学习下

#6


一般都是通过web services/WCF查询服务器进行升级 
配置XML文件保存版本信息,查询服务器获取版本如是最新版本就不要升级 
还可使用smart client 
http://topic.csdn.net/u/20090709/11/3b5136ae-7871-4621-acbf-0c425b81ce78.html?22518

#7


引用 4 楼 llwinnner 的回复:
http://topic.csdn.net/u/20090813/16/1aaa85f4-afee-49a6-abfe-140259d59791.html
这个可以参考一下


那个不行,我试过。老丢包

#8


在VS.Net 的IDE里进行发布,发布向导会让你设置更新的方式。

客户端安装好你的软件之后,每次启动会自动到指定的地方检查是否有最新版本

#9


引用 8 楼 hemowolf 的回复:
在VS.Net 的IDE里进行发布,发布向导会让你设置更新的方式。

客户端安装好你的软件之后,每次启动会自动到指定的地方检查是否有最新版本

但启动的时候,客户端程序的进程就打开了。即使指定的地方有新的版本,也不能覆盖吧

#10


通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
局域网内我一般都采用这种方式,广域网没有试过

#11


帮顶

#12


引用 10 楼 lsj_zrp 的回复:
通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
局域网内我一般都采用这种方式,广域网没有试过


也就是说直接把客户端发布到服务器上,那怎么给用户安装呢?

#13


一般这样做,先查询远程版本号进行对比,然后启动升级程序进程,由升级程序切断主程序进程,覆盖本地主程序或DLL文件,然后启动主程序

#14


引用 3 楼 sydney_carton 的回复:
启动exe的时候检查版本
没有就直接丢个进度框出来,把新的exe下载到临时目录,下载完了说要重启应用程序,结束exe的时候加个事件去调个拷贝脚本,脚本里跑ntsd -c q -pn xxx.exe把你的exe全干掉(如果还有的话),完了把新的exe拷过去


也就是建立一个.bat文件,在结束时 调用.bat。bat里面是先干掉该进程。然后再把临时目录的exe考过来

#15


引用 12 楼 fantasyfreed 的回复:
引用 10 楼 lsj_zrp 的回复:
 通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
 每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
 局域网内我一般都采用这种方式,广域网没有试过


 也就是说直接把客户端发布到服务器上,那怎么给用户安装呢?

你发布完成后会自动弹出一个页面,把里面的地址发给要安装的客户端就行了

#16


引用 13 楼 zhounet 的回复:
一般这样做,先查询远程版本号进行对比,然后启动升级程序进程,由升级程序切断主程序进程,覆盖本地主程序或DLL文件,然后启动主程序


也就是说升级 跟 主程序是两个进程?
好像有道理,我试试

#17


引用 15 楼 lsj_zrp 的回复:
引用 12 楼 fantasyfreed 的回复:
引用 10 楼 lsj_zrp 的回复:
通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
局域网内我一般都采用这种方式,广域网没有试过


也就是说直接把客户端发布到服务器上,那怎么给用户安装呢?

你发布完成后会自动弹出一个页面,把里面的地址发给要安装的客户端就行了


当我有新的版本时,再发布到相同地址。当用户打开客户端程序时,客户端程序会自动发现新版本,然后提示更新?

#18


引用 15 楼 lsj_zrp 的回复:
引用 12 楼 fantasyfreed 的回复:
引用 10 楼 lsj_zrp 的回复:
通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
局域网内我一般都采用这种方式,广域网没有试过


也就是说直接把客户端发布到服务器上,那怎么给用户安装呢?

你发布完成后会自动弹出一个页面,把里面的地址发给要安装的客户端就行了

OK,这个方式可以解决。.net原来如此强大~~

#19


引用 9 楼 fantasyfreed 的回复:
引用 8 楼hemowolf 的回复:
在VS.Net 的IDE里进行发布,发布向导会让你设置更新的方式。

客户端安装好你的软件之后,每次启动会自动到指定的地方检查是否有最新版本

但启动的时候,客户端程序的进程就打开了。即使指定的地方有新的版本,也不能覆盖吧


可以的,这些操作你都不用操心,发布程序帮你解决的
并且这种方式可以让客户在安装时自动安装 dot net framework

#20


一般的做法时,有新版本的时候,不开启客户端启动程序,而是另建立一个进程为自动更新进程,使用这个进程对客户端进行更新覆盖,完毕后,再用自动更新的进程去开启客户端,关闭自动更新进程!

#21


引用 20 楼 lingxingok 的回复:
一般的做法时,有新版本的时候,不开启客户端启动程序,而是另建立一个进程为自动更新进程,使用这个进程对客户端进行更新覆盖,完毕后,再用自动更新的进程去开启客户端,关闭自动更新进程!


通过WebService及上述方法来实现.

#22


借鉴一下网络游戏的更新方法:
先运行AutoUpdate程序,发现有新版本文件就更新之
更新完成后,或者不要更新时
再启动MyApp,并关闭AutoUpdate

#23


为什么不用智能客户端-方便、简单。

#24


我在之前的项目中编写过一个自动更新程序,方法是将更新程序和客户端程序分开。首先更新程序检测服务器上的源文件的版本号和本地机器上客户端文件是否完整,然后从服务器下载需要的文件覆盖到本地,从进程中启动客户端程序,关闭更新程序。
或者你可以直接使用微软的ClickOnce来部署你的程序,但是ClickOnce存在很多不足,客户端的部署如果很复杂的话(比如每个客户端存在不同的资源或者配置文件),ClickOnce就不能处理了,楼主可以仔细研究一下ClickOnce的实现过程设计合乎自己情况的自动更新系统。

#25


采用smartclient智能客户端部署,这样在有新的程序发布后,客户端会提示下载;即使客户端正在执行目前的进程,在下载(覆盖)时也会有提示。

#26


对3楼的方法感兴趣,回头试试

#27


说多没用。我给你,我自己写的自动更新程序。好用。

#28


该回复于2009-12-18 11:30:18被版主删除

#29


不清楚你用的更新机制是什么样的

程序启动,Shown事件里检查更新
如果更新,启动ftp更新程序并关闭自己

                            frmUpdateHint UpdateHint = new frmUpdateHint(LastVersionText);
                            UpdateHint.Icon = Icon;
                            if (UpdateHint.ShowDialog() == DialogResult.OK)
                            {
                                System.Diagnostics.Process.Start(Consts.SERVICE_UPDATE_VERSIONFILE_EXECUATENAME, LastVersionText);
                                Close();
                                return;
                            }


更新程序更新完重新启动系统,带有版本信息的文件最后下载,防止更新失败但版本信息已更新
而且如果更新程序本身也有更新的,就把新下载的更新程序存成类似“_更新程序”

void BtnClose_Click(object sender, EventArgs e)
        {
            if (OK)
                System.Diagnostics.Process.Start(SERVICE_FOREGROUNDMONITOR_EXECUATENAME);
            Close();
        }


系统重新启动后检查有没有“_更新程序”,有则改名为“更新程序”更新更新程序本身

#30


楼主的问题其实很好解决

就是在解决方案管理器那里进行发布就可以了,生成安装程序让客户自己安装。这样即可以解决客户的电脑上没有安装dot net framework 问题,也可以解决版本更新问题。更新的版本放在一个 web 服务器上,如果有新版本需要发布,可以将版本重新发布到这个 web 服务器上,客户机每次启动的时候会自动到指定的服务器上检查是否有最新版,并询问客户是否安装

楼主自己试几次就会用了,很简单的

#31


下载一个制作更新的软件。
弄一个就好了。
哪有这么复杂。。。


___________________________________
我写的vs2005源代码管理器,只有团队资源管理中源码管理的功能。
http://topic.csdn.net/u/20091203/10/ca40b678-5443-4a18-a9f6-fad9051d0797.html

#32


#33


#1


能不能 这样, 客户端 先由 管理程序启动,管理程序 判断已经下载了更新 就覆盖 客户端,但是不用覆盖自己, 然后 再启动客户端。 这样 更新下载完后 重启就ok了

#2


引用 1 楼 jingshuaizhjason 的回复:
能不能 这样, 客户端 先由 管理程序启动,管理程序 判断已经下载了更新 就覆盖 客户端,但是不用覆盖自己, 然后 再启动客户端。 这样 更新下载完后 重启就ok了


管理程序启动 也调用该进程了,下载后不能更新。该进程启动时不能覆盖更新的。

#3


启动exe的时候检查版本
没有就直接丢个进度框出来,把新的exe下载到临时目录,下载完了说要重启应用程序,结束exe的时候加个事件去调个拷贝脚本,脚本里跑ntsd -c q -pn xxx.exe把你的exe全干掉(如果还有的话),完了把新的exe拷过去

#4


#5


我现在刚接手一个软件,里面有个自动更新,就是自动从ftp服务器上检测最新版本,然后下载下来安装;
现在碰到的问题就是被防火墙当做病毒,每次自动更新防火墙都会报警;

所以准备重写,我也不太会,来学习下

#6


一般都是通过web services/WCF查询服务器进行升级 
配置XML文件保存版本信息,查询服务器获取版本如是最新版本就不要升级 
还可使用smart client 
http://topic.csdn.net/u/20090709/11/3b5136ae-7871-4621-acbf-0c425b81ce78.html?22518

#7


引用 4 楼 llwinnner 的回复:
http://topic.csdn.net/u/20090813/16/1aaa85f4-afee-49a6-abfe-140259d59791.html
这个可以参考一下


那个不行,我试过。老丢包

#8


在VS.Net 的IDE里进行发布,发布向导会让你设置更新的方式。

客户端安装好你的软件之后,每次启动会自动到指定的地方检查是否有最新版本

#9


引用 8 楼 hemowolf 的回复:
在VS.Net 的IDE里进行发布,发布向导会让你设置更新的方式。

客户端安装好你的软件之后,每次启动会自动到指定的地方检查是否有最新版本

但启动的时候,客户端程序的进程就打开了。即使指定的地方有新的版本,也不能覆盖吧

#10


通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
局域网内我一般都采用这种方式,广域网没有试过

#11


帮顶

#12


引用 10 楼 lsj_zrp 的回复:
通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
局域网内我一般都采用这种方式,广域网没有试过


也就是说直接把客户端发布到服务器上,那怎么给用户安装呢?

#13


一般这样做,先查询远程版本号进行对比,然后启动升级程序进程,由升级程序切断主程序进程,覆盖本地主程序或DLL文件,然后启动主程序

#14


引用 3 楼 sydney_carton 的回复:
启动exe的时候检查版本
没有就直接丢个进度框出来,把新的exe下载到临时目录,下载完了说要重启应用程序,结束exe的时候加个事件去调个拷贝脚本,脚本里跑ntsd -c q -pn xxx.exe把你的exe全干掉(如果还有的话),完了把新的exe拷过去


也就是建立一个.bat文件,在结束时 调用.bat。bat里面是先干掉该进程。然后再把临时目录的exe考过来

#15


引用 12 楼 fantasyfreed 的回复:
引用 10 楼 lsj_zrp 的回复:
 通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
 每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
 局域网内我一般都采用这种方式,广域网没有试过


 也就是说直接把客户端发布到服务器上,那怎么给用户安装呢?

你发布完成后会自动弹出一个页面,把里面的地址发给要安装的客户端就行了

#16


引用 13 楼 zhounet 的回复:
一般这样做,先查询远程版本号进行对比,然后启动升级程序进程,由升级程序切断主程序进程,覆盖本地主程序或DLL文件,然后启动主程序


也就是说升级 跟 主程序是两个进程?
好像有道理,我试试

#17


引用 15 楼 lsj_zrp 的回复:
引用 12 楼 fantasyfreed 的回复:
引用 10 楼 lsj_zrp 的回复:
通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
局域网内我一般都采用这种方式,广域网没有试过


也就是说直接把客户端发布到服务器上,那怎么给用户安装呢?

你发布完成后会自动弹出一个页面,把里面的地址发给要安装的客户端就行了


当我有新的版本时,再发布到相同地址。当用户打开客户端程序时,客户端程序会自动发现新版本,然后提示更新?

#18


引用 15 楼 lsj_zrp 的回复:
引用 12 楼 fantasyfreed 的回复:
引用 10 楼 lsj_zrp 的回复:
通过VS2005把程序发布在服务器上(在Project上右键属性,可以看到有个发布的选项卡),其它的机器通过IE访问来安装程序
每次客户端打开程序的时候它都会自动检测,如果有新的版本就会提示是否更新
局域网内我一般都采用这种方式,广域网没有试过


也就是说直接把客户端发布到服务器上,那怎么给用户安装呢?

你发布完成后会自动弹出一个页面,把里面的地址发给要安装的客户端就行了

OK,这个方式可以解决。.net原来如此强大~~

#19


引用 9 楼 fantasyfreed 的回复:
引用 8 楼hemowolf 的回复:
在VS.Net 的IDE里进行发布,发布向导会让你设置更新的方式。

客户端安装好你的软件之后,每次启动会自动到指定的地方检查是否有最新版本

但启动的时候,客户端程序的进程就打开了。即使指定的地方有新的版本,也不能覆盖吧


可以的,这些操作你都不用操心,发布程序帮你解决的
并且这种方式可以让客户在安装时自动安装 dot net framework

#20


一般的做法时,有新版本的时候,不开启客户端启动程序,而是另建立一个进程为自动更新进程,使用这个进程对客户端进行更新覆盖,完毕后,再用自动更新的进程去开启客户端,关闭自动更新进程!

#21


引用 20 楼 lingxingok 的回复:
一般的做法时,有新版本的时候,不开启客户端启动程序,而是另建立一个进程为自动更新进程,使用这个进程对客户端进行更新覆盖,完毕后,再用自动更新的进程去开启客户端,关闭自动更新进程!


通过WebService及上述方法来实现.

#22


借鉴一下网络游戏的更新方法:
先运行AutoUpdate程序,发现有新版本文件就更新之
更新完成后,或者不要更新时
再启动MyApp,并关闭AutoUpdate

#23


为什么不用智能客户端-方便、简单。

#24


我在之前的项目中编写过一个自动更新程序,方法是将更新程序和客户端程序分开。首先更新程序检测服务器上的源文件的版本号和本地机器上客户端文件是否完整,然后从服务器下载需要的文件覆盖到本地,从进程中启动客户端程序,关闭更新程序。
或者你可以直接使用微软的ClickOnce来部署你的程序,但是ClickOnce存在很多不足,客户端的部署如果很复杂的话(比如每个客户端存在不同的资源或者配置文件),ClickOnce就不能处理了,楼主可以仔细研究一下ClickOnce的实现过程设计合乎自己情况的自动更新系统。

#25


采用smartclient智能客户端部署,这样在有新的程序发布后,客户端会提示下载;即使客户端正在执行目前的进程,在下载(覆盖)时也会有提示。

#26


对3楼的方法感兴趣,回头试试

#27


说多没用。我给你,我自己写的自动更新程序。好用。

#28


该回复于2009-12-18 11:30:18被版主删除

#29


不清楚你用的更新机制是什么样的

程序启动,Shown事件里检查更新
如果更新,启动ftp更新程序并关闭自己

                            frmUpdateHint UpdateHint = new frmUpdateHint(LastVersionText);
                            UpdateHint.Icon = Icon;
                            if (UpdateHint.ShowDialog() == DialogResult.OK)
                            {
                                System.Diagnostics.Process.Start(Consts.SERVICE_UPDATE_VERSIONFILE_EXECUATENAME, LastVersionText);
                                Close();
                                return;
                            }


更新程序更新完重新启动系统,带有版本信息的文件最后下载,防止更新失败但版本信息已更新
而且如果更新程序本身也有更新的,就把新下载的更新程序存成类似“_更新程序”

void BtnClose_Click(object sender, EventArgs e)
        {
            if (OK)
                System.Diagnostics.Process.Start(SERVICE_FOREGROUNDMONITOR_EXECUATENAME);
            Close();
        }


系统重新启动后检查有没有“_更新程序”,有则改名为“更新程序”更新更新程序本身

#30


楼主的问题其实很好解决

就是在解决方案管理器那里进行发布就可以了,生成安装程序让客户自己安装。这样即可以解决客户的电脑上没有安装dot net framework 问题,也可以解决版本更新问题。更新的版本放在一个 web 服务器上,如果有新版本需要发布,可以将版本重新发布到这个 web 服务器上,客户机每次启动的时候会自动到指定的服务器上检查是否有最新版,并询问客户是否安装

楼主自己试几次就会用了,很简单的

#31


下载一个制作更新的软件。
弄一个就好了。
哪有这么复杂。。。


___________________________________
我写的vs2005源代码管理器,只有团队资源管理中源码管理的功能。
http://topic.csdn.net/u/20091203/10/ca40b678-5443-4a18-a9f6-fad9051d0797.html

#32


#33