首页 新闻 会员 周边 捐助

c# winform 自动更新功能

0
悬赏园豆:10 [已解决问题] 解决于 2015-01-30 16:41

我参考网上的资料,通过AutoUpdater去实现winform 的更新功能。

AutoUpdater 的源码来自:http://autoupdater.codeplex.com/

我可以成功将新的msi安装包下载到安装目录中,但下载完之后不会自动启动安装,请问如何解决呢?

另外,网上有资料说可以不用更新整个msi安装包的,只需要把需要更新的cs编译好,下载到安装目录就可以了,请问大家有什么好的建议吗?谢谢。

cwcls的主页 cwcls | 初学一级 | 园豆:27
提问于:2014-12-19 09:43
< >
分享
最佳答案
0

这个自动更新应该是覆盖文件的这种实现,并不是重新安装。

收获园豆:2
幻天芒 | 高人七级 |园豆:37207 | 2014-12-19 10:05

感谢您的回复。

如果我要更新一个Form(窗体的设计,以及逻辑)如果不重新安装,怎么实现覆盖呢?

cwcls | 园豆:27 (初学一级) | 2014-12-19 10:13

@cwcls: 你把更新的DLL直接下载覆盖就行。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-19 10:22

@爱编程的大叔: 你的意思是,把项目的输出类型改为【类库】,然后把dll下载到安装目录,是这样吗?

cwcls | 园豆:27 (初学一级) | 2014-12-19 10:26

@cwcls: 是的。

完整的更新方案,应该是:

1、可以更新各种DLL

2、可以更新主运行程序EXE

3、可以更新更新DLL自身

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-19 10:33

@爱编程的大叔: 谢谢。我不懂如何更新主运行程序EXE

cwcls | 园豆:27 (初学一级) | 2014-12-19 10:45

@cwcls: 你可以自己思考一下,然后再上网GOOGLE。

到这一步其实已经很容易了。如果不行的话,就变成主程序不更新,

其实现在主程序一般已经不做啥事了,不更新一般问题也不大。

主要功能都写在DLL里面,就可以不更新主程序了。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-19 10:51

@cwcls: 一般来说,更新的步骤是:关闭主程序,替换dll和exe,重启exe。

幻天芒 | 园豆:37207 (高人七级) | 2014-12-19 11:58
其他回答(5)
0

那个源码很简单的,你不会看看吗?

就算不想重新发明一个轮子,至少你得看下别人发明的轮子是怎么工作的吧?

收获园豆:2
爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-19 09:47

我看懂了大概思路。就是先比较版本,如果需要更新就下载到安装目录下。已经实现了下载到安装目录,但不知道再如何去自动安装msi这个文件。

支持(0) 反对(0) cwcls | 园豆:27 (初学一级) | 2014-12-19 09:49

@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这个是你要自己修改的,指向你的服务器版本控制。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-19 09:58

@爱编程的大叔: 谢谢您的热心回复。

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再次安装一次,覆盖原来的版本。

是否我的理解有问题?

支持(0) 反对(0) cwcls | 园豆:27 (初学一级) | 2014-12-19 10:10

@cwcls: 我都是直接覆盖啊。没有必要再安装了.

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-19 10:21

@爱编程的大叔: 我的安装目录下就三个文件:AutoUpdateWinformTest.exe,AutoUpdater.config,AutoUpdater.dll

下载回来的AutoUpdateFormTest.msi覆盖哪一个呢?

谢谢

支持(0) 反对(0) cwcls | 园豆:27 (初学一级) | 2014-12-19 10:27

@cwcls: 你下载了个啥啊,你应该下载AutoUpdateFormTest.exe,下载完直接覆盖。

但是单纯只靠这个DLL,应该是无法覆盖主运行文件的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-19 10:32

@爱编程的大叔: 下载AutoUpdateFormTest.exe?AutoUpdateFormTest.exe我怎么生成呢?我用的是VS2010,AutoUpdateFormTest项目就只有一个Form1的窗体,运行的是偶直接打开Form1的。

请再指教,谢谢^_^

支持(0) 反对(0) cwcls | 园豆:27 (初学一级) | 2014-12-19 10:44

@cwcls: 自动更新这个功能,我是在赚了几十万以后才开发的。

我个人更加偏好先实现生产率,再考虑如何Save the world。

作为原理,你可以学习,但自动更新真的不是必学的。

1、小的开发团队,直接COPY+PASTE给客户就行了。

2、大的软件公司,自动更新也轮不到你开发。

支持(0) 反对(1) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-19 10:55
0

以前VS里面有个叫智能客户端的玩意,就是干这个的,不知道现在还有没有。

收获园豆:2
annpaul | 园豆:85 (初学一级) | 2014-12-19 09:48
0

一直使用ClickOnce发布winform程序,  只要关心版本号就行了。。。

适合大部分场景, 当然有利有弊是肯定的。

收获园豆:2
问天何必 | 园豆:3311 (老鸟四级) | 2014-12-19 14:13

clickonce不能指定安装目录,以及shortcut图标等吧

支持(0) 反对(0) cwcls | 园豆:27 (初学一级) | 2014-12-19 16:54
0

ClickOnce多好用呀

收获园豆:2
会长 | 园豆:12463 (专家六级) | 2014-12-19 16:42

我需要指定安装目录,shortcut图标,startmenu图标,可以实现?

支持(0) 反对(0) cwcls | 园豆:27 (初学一级) | 2014-12-19 16:55

@cwcls:  当然能, 现在连安装包exe的图标都能改。 具体看我之前回答过的问题。 

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2014-12-19 17:53

@问天何必: 谢谢,能给个链接吗?

支持(0) 反对(0) cwcls | 园豆:27 (初学一级) | 2014-12-23 10:17
0

如果你使用msi方式,那可以把msi文件放到TEMP里,最用GUID建个文件夹放里去,以免与别的文件冲突,下载完之后用,Process.Start启动就可以了。至于msi文件,我觉得等到系统清理垃圾时自己清理即可。

 

如果你使用下载文件覆盖的方式(我之前用的这个方法),建议你把文件先做成zip下载之后解压再覆盖,直接下载文件可能出现,exe文件下载的与服务器上的文件不一致的情况,而且这个问题并不是所有机器都有,如果PC存在这个问题,那什么下载都不行,包括IE,CHROME,迅雷等等。

(我的就遇到了,所以我换成了安装包方式,安装包自动检测是否有旧版本,是否进行覆盖安装)

Selway | 园豆:-6 (初学一级) | 2014-12-24 10:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册