这个自动更新应该是覆盖文件的这种实现,并不是重新安装。
感谢您的回复。
如果我要更新一个Form(窗体的设计,以及逻辑)如果不重新安装,怎么实现覆盖呢?
@cwcls: 你把更新的DLL直接下载覆盖就行。
@爱编程的大叔: 你的意思是,把项目的输出类型改为【类库】,然后把dll下载到安装目录,是这样吗?
@cwcls: 是的。
完整的更新方案,应该是:
1、可以更新各种DLL
2、可以更新主运行程序EXE
3、可以更新更新DLL自身
@爱编程的大叔: 谢谢。我不懂如何更新主运行程序EXE
@cwcls: 你可以自己思考一下,然后再上网GOOGLE。
到这一步其实已经很容易了。如果不行的话,就变成主程序不更新,
其实现在主程序一般已经不做啥事了,不更新一般问题也不大。
主要功能都写在DLL里面,就可以不更新主程序了。
@cwcls: 一般来说,更新的步骤是:关闭主程序,替换dll和exe,重启exe。
那个源码很简单的,你不会看看吗?
就算不想重新发明一个轮子,至少你得看下别人发明的轮子是怎么工作的吧?
我看懂了大概思路。就是先比较版本,如果需要更新就下载到安装目录下。已经实现了下载到安装目录,但不知道再如何去自动安装msi这个文件。
@cwcls: 这个不需要安装的。
1、在你的软件启动中,添加autoUpdater.dll引用。
2、在软件中,加入几行代码,检查更新。
3、在你的服务器上,放置相应的用于更新的检查URL。
4、当你的软件有更新时,需要修改服务器上的XML文件,以及将相应的可供下载的文件放到服务器上。
5、包括检查版本号,与服务器上的进行对比,下载更新文件,更新,这些都做在AutoUpdater.dll里面了。
<?xml version="1.0" encoding="utf-8"?> 2 <Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <Enabled>true</Enabled> 4 <ServerUrl>http://localhost/TVClientService/TVClientAutoupdateService.xml</ServerUrl> 5 <UpdateFileList> 6 <LocalFile path="TVClientVersion" lastver="1.0.4.17" size="11913728" /> 7 </UpdateFileList> 8 </Config>
ServerURl这个是你要自己修改的,指向你的服务器版本控制。
@爱编程的大叔: 谢谢您的热心回复。
1至5,我都实现了。
比如我有一个程序(包含1~5)是AutoUpdateWinformTest.msi,我先在本地win7安装了AutoUpdateWinformTest.msi.
客户端AutoUpdater.config:
<?xml version="1.0" encoding="utf-8" ?>
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Enabled>true</Enabled>
<ServerUrl>http://192.168.1.148:8087/AutoupdateService.xml</ServerUrl>
<UpdateFileList>
<LocalFile path="AutoUpdateFormTest.msi" lastver="1.0.0" size="400" />
</UpdateFileList>
</Config>
IIS 服务器的xml:
<?xml version="1.0" encoding="utf-8"?>
<updateFiels>
<file path="AutoUpdateFormTest.msi" url="http://192.168.1.148:8087/AutoUpdateFormTest.msi" lastver="1.0.1" size="47000" needRestart="True"/>
</updateFiels>
当我启动AutoUpdateFormTest的时候,有提出更新提示,且把IIS上的AutoUpdateFormTest.msi下载到了安装目录中,然后就弹出提示说需要重启程序完成安装,当我重启之后发觉程序没有发生任何变化。
我的理解是,应该会把下载回来的AutoUpdateFormTest.msi再次安装一次,覆盖原来的版本。
是否我的理解有问题?
@cwcls: 我都是直接覆盖啊。没有必要再安装了.
@爱编程的大叔: 我的安装目录下就三个文件:AutoUpdateWinformTest.exe,AutoUpdater.config,AutoUpdater.dll
下载回来的AutoUpdateFormTest.msi覆盖哪一个呢?
谢谢
@cwcls: 你下载了个啥啊,你应该下载AutoUpdateFormTest.exe,下载完直接覆盖。
但是单纯只靠这个DLL,应该是无法覆盖主运行文件的。
@爱编程的大叔: 下载AutoUpdateFormTest.exe?AutoUpdateFormTest.exe我怎么生成呢?我用的是VS2010,AutoUpdateFormTest项目就只有一个Form1的窗体,运行的是偶直接打开Form1的。
请再指教,谢谢^_^
@cwcls: 自动更新这个功能,我是在赚了几十万以后才开发的。
我个人更加偏好先实现生产率,再考虑如何Save the world。
作为原理,你可以学习,但自动更新真的不是必学的。
1、小的开发团队,直接COPY+PASTE给客户就行了。
2、大的软件公司,自动更新也轮不到你开发。
以前VS里面有个叫智能客户端的玩意,就是干这个的,不知道现在还有没有。
一直使用ClickOnce发布winform程序, 只要关心版本号就行了。。。
适合大部分场景, 当然有利有弊是肯定的。
clickonce不能指定安装目录,以及shortcut图标等吧
ClickOnce多好用呀
我需要指定安装目录,shortcut图标,startmenu图标,可以实现?
@cwcls: 当然能, 现在连安装包exe的图标都能改。 具体看我之前回答过的问题。
@问天何必: 谢谢,能给个链接吗?
如果你使用msi方式,那可以把msi文件放到TEMP里,最用GUID建个文件夹放里去,以免与别的文件冲突,下载完之后用,Process.Start启动就可以了。至于msi文件,我觉得等到系统清理垃圾时自己清理即可。
如果你使用下载文件覆盖的方式(我之前用的这个方法),建议你把文件先做成zip下载之后解压再覆盖,直接下载文件可能出现,exe文件下载的与服务器上的文件不一致的情况,而且这个问题并不是所有机器都有,如果PC存在这个问题,那什么下载都不行,包括IE,CHROME,迅雷等等。
(我的就遇到了,所以我换成了安装包方式,安装包自动检测是否有旧版本,是否进行覆盖安装)