做了一个CS结构软件,有十几个用户使用的客户端,因为刚开始试用期间,要不断根据用户使用情况修正问题和添加新功能,所以频繁更新是不可避免的,暂时没有深入去研究软件更新,暂时采取的方式是用户通过FTP自行更新,这种方式很麻烦,最烦的是,常常有很多用户忘记更新,而我预期的是一旦更新,每个客户端都能自行更新到最新版本。

后面想到使用微软的ClickOnce,每次我将新版本软件发布到服务器上,然后用户再打开软件的时候,ClickOnce会自行判断软件是否需要更新,然后通过点击就可以实现更新,这样无疑是非常好的。

不过经过我的实践使用和搜索其他使用ClickOnce的人的经验,虽然发现ClickOnce其实有很多问题的,不过一番研究下来,ClickOnce其实是能够满足我的简单需求的,那么后面就决定使用ClickOnce了。

下面我将ClickOnce的用法以及遇到的一些疑点和解决方案写出来,内容简单,并没有太过深入,希望会对其他有类似需求的朋友有一点帮助。

ClickOnce可以发布WinForm或者WPF等客户端程序,一般是发布到公共的服务器上,部署安装直接给用户发一个html地址,他们点击这个地址就可以安装了。

需要做的准备工作有:

提前在服务器上开一个IIS网站站点,端口号可以使用空闲的,比如8001等(要设置防火墙允许,不然会被挡住),设置好程序池,对应文件夹访问权限,可以用一个自制的简单html文件测试一下该站点是否OK。

然后设置一个到该站点对应文件夹的FTP服务,我使用的FTP服务器软件是Xlight,非常好用的软件,极力推荐。FTP服务是为了方便以后你往服务器上上传新的客户端部署文件用的。

接下来就是要在VS当中设定你要部署的项目属性了。

打开项目的属性页,选择发布选项卡,如下图:

发布位置有两个,第一个是【发布文件夹位置】,意思就是你的软件程序会被压缩打包放到的地方,后续安装就要用到这些文件,可以直接点击后面的按钮,选择FTP或者本地,因为Click Once的FTP做的太简陋了,发布上传速度十分感人,而且我在实际使用当中有时候会出现莫名奇妙发布到其他地方的怪异现象,所以推荐选择本地的一个文件夹,后续再自行上传到服务器地址。

第二个是【安装URL】,这个地址就是后面实际用户从什么地方来安装你的软件,也就是你上面发布的那些程序文件后面实际存放的位置,一般用户是通过服务器来安装你的软件的,所以一般这里写的是服务器地址,我这里地址端口后面的目录是因为我在这个地址上要发布多个软件,所以用不同的目录访问区别一下。

安装模式有两种,一个就是只能联机使用(每次用都要连接到你的安装服务器),一种就是可以脱机使用(一时半伙连接不上安装服务器也可以,只是不能更新罢了),一般选择第二种。

下面发布的版本号和你在程序集里设定的版本号不一样的,这个版本号只是为了更新的目的。

每次客户端检测到安装服务器上的版本号比当前客户端的号大,就会提示更新(和实际你的程序有没有变动没有关系),手动更改还是自动递增结合自己的情况来选择。

 

点击应用程序文件会出现下面的窗口

这里就是你的项目中将要发布给用户的文件,基本上exe和dll都会包含进去,但是有些资源文件,比如图片,其他文档等,如果在这个列表当中没有看到,就要会到项目资源管理器当中,右键设定他们的输出属性为内容,并且复制到目录中,这样就会在应用程序文件列表中看到它们了,对应的文件夹层次也会自动生成的(列表中看不到)。

接下来使用系统必备组件,这个很好理解,不详细说了。

接下来是更新设定

上面的很清楚,不说了,下面指定最低版本的意思就是允许运行的最低版本(低于这个版本,不更新不让你用,有些用户在有更新提示的时候会选择不更新)

更新位置如果为空,默认就是安装服务器,如果你换其他服务器来更新的话,就重新设定一下位置。

接下来是选项,有四个选项卡

说明部分下面的支持url就是提供支持服务的网站,错误url就是程序出错之后转到的网址,一般不用填写

部署网页就是用户头一次安装的时候需要打开的网站,名字自己拟定,发布的时候会自动生成,访问的时候通过192.168.16.254:8001/PMS/publish.html

 

清单,有用的是创建桌面快捷方式,快捷方式的图标就是程序的图标

如果需要关联的文件的话,在这里设定一下。

 

这些都设定好了之后就可以直接发布了,发布后的文件会在发布设定的本地文件夹中(如果你设定了发布文件夹的话)

然后将这些文件用FTP上传到你设定的安装服务器的地址上,之后就可以通过192.168.16.254:8001/PMS/publish.html的地址进行访问安装了。

最后还要说的就是签名

没有正式的签名证书就暂时不签名了,签名的作用都知道,没有签名在安装的时候会出现风险警告提示,不过是自己知道可以信任,这时候一路确认就行了。

用户第一次安装完后,当有新的更新传送到服务器的上的时候,用户在打开安装好的客户端的时候就会自动检测版本,一旦发现需要更新,那么就会自动提示下面的信息。

一路确认即可。

以上就是Click Once的入门使用,希望能有帮助。

接下来再说说它的一些问题。

从MSDN上看,ClickOnce每次更新都是下载更改过的部分,然后从重新安装,而且每个版本之间是独立,不会互相影响,同时它对权限控制的比较严格。

我查看过来,安装的位置其实是在用户文件夹下隐藏的C:\Users\用户名\AppData\Local\Apps,配置和其他程序一样都默认放在Local里,有些人觉得这个很不自由,但是除非你的程序对系统权限有很多特殊的要求的话,还是按照微软的设定走比较合理,印象中Chrome就是这么设定的。

我认为,就一般需求来说,ClickOnce是能够满足需求的,如果有更多特殊的要求,就只能使用其他成熟的更新组件或者干脆自己设计一个好了。

Click Once使用总结的更多相关文章

  1. click事件的累加绑定,绑定一次点击事件,执行多次

    最近做项目为一个添加按钮绑定点击事件,很简单的一个事情,于是我按照通常做法找到元素,使用jquery的on()方法为元素绑定了点击事件,点击同时发送请求.完成后看效果,第一次点击没有问题.再一次点击后 ...

  2. 移动开发那些坑之——safari mobile click事件的冒泡bug

    今天在iphone6 plus的safari上测试这么一段代码: <script> $(document).on('click','.callApp', function() { aler ...

  3. 苹果手机不支持click文字 需要添加 cursor:pointer 才能 识别可以点击

    给一个div 绑定一个 click事件,  苹果手机会识别不了,必须添加一个 cursor:pointer 才能 识别可以点击.安卓正常识别.

  4. AlloyTouch Button插件-不再愁click延迟和点击态

    移动端不能使用click,因为click会有300ms.所有有了fastclick这样的解决方案.然后fastclick并没有解决点击态(用户点击的瞬间要有及时的外观变化反馈)的问题.hover会有不 ...

  5. js动态绑定click事件时function传参问题

    今天碰到了这样一个问题,我在javascript中动态创建了一个button, 然后我想给改button添加click事件,绑定的function想要传入一个变量参数, 一开始我想直接通过函数传参传进 ...

  6. 阿里技术协会好文推荐:Android绘制流程http://click.aliyun.com/m/8719/

    一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL.Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...

  7. 移动端web开发,click touch tap区别

    转自: http://blog.csdn.net/sly94/article/details/51701188 移动端用tap时会有穿透问题 一:click与tap比较 click与tap都会触发点击 ...

  8. v-for遍历出的元素上添加click事件,获取对应元素上的属性id值

    <span v-for="(n,nav) in floorList" data-id="{{nav.itemId}}" v-on:click=" ...

  9. jquery 自定义click事件执行多次

    用jquery绑定一个按钮click事件后,第一次点击后一切正常,第二次点击竟然执行两次,以后越来越多, 后来查看文档发现 jquery click 不是替换原有的function 而是接着添加,所以 ...

  10. 关于a标签自身的click事件所带来的一些影响

    众所周知a标签自身带有点击事件<a href="#"></a>从它本身的特性来讲并没有什么不好的影响,但是如果你在a标签里又加入onclick事件则< ...

随机推荐

  1. Knowledge Point 20180303 我们为什么要配置环境变量

    1.1为什么要配置环境变量 在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH.正确地配置这些环境变量,是能够顺利学习.开发的前提.而经常出现的问 ...

  2. Cornerstone|SVN

    SQLite-database disk image is malformed missing from working copy mac下CornerstoneSVN出错 Description _ ...

  3. 浅谈async函数await用法

    今天状态不太好,睡久了懵一天. 以前只是了解过async函数,并还没有很熟练的运用过,所以先开个坑吧,以后再结合实际来更新下,可能说的有些问题希望大家指出. async和await相信大家应该不陌生, ...

  4. 737 MAX 8-Think

    波音 737 MAX 8的事故,凸显传感器数据在失真的情况下,软件系统需要如何设计的问题:这点感觉波音那么大的公司,不应该不会没有考虑到. 正常来说传感器给出错误的数据,通常是计算出错误的结果,就像做 ...

  5. ubnutu 安装protocol buffer

    工作中需要使用protocol buffer,需要编译出protocol buffer的动态链接库,然后在别的makefile中链接它, 我的环境是ubnutu16.04,64bit,使用的proto ...

  6. 高级同步器:可重用的同步屏障Phaser

    引自:https://shift-alt-ctrl.iteye.com/blog/2302923 在JAVA 1.7引入了一个新的并发API:Phaser,一个可重用的同步barrier.在此前,JA ...

  7. JSP/Servlet开发——第八章 JSTL和EL

    1. EL表达式: ●需要EL表达式的原因: ◆在JSP中使用Java脚本的局限: 1).在JSP页面中嵌入大量的Java代码: 2).访问结构比较复杂的数据时代码烦琐,且经常需要强制类型转换: eg ...

  8. SQL Server 2012 - 动态SQL查询

    动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...

  9. ffmreg thinkphp 控制器 获取音频视频详细信息(获取时长)

    FFmpeg下载:http://ffmpeg.zeranoe.com/builds/ 下载并解压FFmpeg文件夹: 打开你想安装的任意磁盘,例如:d盘.新建一个名为“ffmpeg”的文件夹,将第二步 ...

  10. Delphi Math单元函数

    本文转至http://blog.sina.com.cn/s/blog_976ba8a501010vvf.html 这个单元包含高性能的算术.三角.对数.统计和金融方面的计算及FPU程序函数用于补充De ...