日期:2014-05-17  浏览次数:21405 次

请问winform的自动更新怎么替换更新程序自身的dll?
因为有几个程序都需要更新功能,所以就把更新模块做成dll形式,但是这个dll除了更新模块还有别的功能模块(也就是说这个dll也需要更新的)。请问更新替换时候应该怎么替换?难道要把更新独立成一个不会修改的dll?


再问下,有什么办法在客户端没安装压缩工具的情况下直接下载需要更新模块的压缩包然后再解压替换吗?

谢谢指点。

------解决方案--------------------
你好,本人做过 . 我可以给你思路 .
1,本地有个标示符,每个文件都有自己的标示符 .至于怎么记录那看你怎么写了.
2,从服务端获取所有最新要更新的文件 . 
3,服务端文件与本地文件匹配 .
以上操作是在你的客户端启动的时候,后台加载这些东西 .
如果以上匹配有需要更新的文件 ,将更新的文件记录下来. 
4,启动更新程序,这个更新程序 是单独做的.跟客户端程序是分开的,我是把这个更新程序放在客户端程序某个路径下. 用于方便启动, 打包的时候这个程序也要打包.
5,根据需要更新的文件信息 从服务器上下载下来. 替换.替换成功一次,则将本地文件信息修改为最新.
6,更新完毕,重启.   每次都这样验证.
------解决方案--------------------
每次升级的时候不更新dll,登陆系统的时候,再去下载最新的更新程序dll
------解决方案--------------------
写两个程序,一个做更新用的,更新的时候,打开更新程序,关闭自身,做的好点的话,更新程序写文件前判断下所要更新的文件是否都能写入
------解决方案--------------------
服务端有一个文件,记录了所有dll的版本(更新时间),客户端也有一个对应的文件,每次运行更新时比较文件中记录的各个dll的版本,若不同就下载。压缩包我看没有必要,你每次上传更新的时候也不是每次上传一个压缩包吧?
如果你的客户端正在运行,并加载了一个dll,想要替换这个dll是比较难的,可以考虑定时检查更新,如果检查需要更新,就弹出一个提示。就像windows update一样。
------解决方案--------------------
使用强命名程序集。
------解决方案--------------------
引用:
引用:服务端有一个文件,记录了所有dll的版本(更新时间),客户端也有一个对应的文件,每次运行更新时比较文件中记录的各个dll的版本,若不同就下载。压缩包我看没有必要,你每次上传更新的时候也不是每次上传一个压缩包吧?
如果你的客户端正在运行,并加载了一个dll,想要替换这个dll是比较难的,可以考虑定时检查更新,如果检查需要更新,就……

所谓“运行时替换”,最好就是程序开始时检查更新。如果所有dll都已经加载了,就没法替换了。
------解决方案--------------------
生成一个批处理文件
执行批处理文件并且自身退出
批处理文件中执行覆盖操作
批处理中最后一句启动本程序
完成更新
------解决方案--------------------
自己本身肯定是无法替换的因为你的正在是用中。只能通过另一个update程序在替换。
------解决方案--------------------
引用:
引用:自己本身肯定是无法替换的因为你的正在是用中。只能通过另一个update程序在替换。

不一定是直接替换  可以是别的方法  例如先把原程序重命名等下次主程序启动时候判断删除

你的程序在运行的时候还可以改变本身运行程序的名字?
------解决方案--------------------
引用:
引用:自己本身肯定是无法替换的因为你的正在是用中。只能通过另一个update程序在替换。

不一定是直接替换  可以是别的方法  例如先把原程序重命名等下次主程序启动时候判断删除

有些东西还是怎么简单怎么来,我也想过通过独立应用程序域来动态更新,但发现实在太麻烦,代码会写的很乱,不能接受,可能我还没达到那个水平
------解决方案--------------------
http://v.youku.com/v_show/id_XNDQ2NDk0NDky.html
上面是视频录像,演示EXE结合批处理实现自动更新(包括update.exe自身)