做了一个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. FreeRTOS 查询任务 剩余的栈空间的 方法

    FreeRTOS 源码下载地址 1.官方文档提供了   函数  用来查询  任务 剩余   栈 空间,首先是看官方的文档解释(某位大神 翻译 的 官方文档.) 参数解释:     xTask:被查询任 ...

  2. 01-Python学习笔记-基础语法

    Python标识符 -d           在解析时显示调试信息 -O           生成优化代码 ( .pyo 文件 ) -S           启动时不引入查找Python路径的位置 - ...

  3. JavaScript常用DOM操作方法和函数

    查找节点ocument.querySelector(selectors) //接受一个CSS选择器作为参数,返回第一个匹配该选择器的元素节点.document.querySelectorAll(sel ...

  4. FreeImage 生成带透明通道的GIF

    主要方法: 加载图像及读取参数 FreeImage_Load FreeImage_GetWidth FreeImage_GetHeight FreeImage_Allocate FreeImage_G ...

  5. ubuntu下安装memcached和PHP的memcache扩展

    依赖包和软件包下载地址: Libevent:https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/li ...

  6. Dubbo 安装ZooKeeper环境

    一.在Windows 安装ZooKeeper 1.下载ZooKeeper 2.解压,修改ZooKeeper配置文件 复制一份zoo_sample.cfg文件,改名位zoo.cfg,打开编辑,设置数据保 ...

  7. 坑爹的jquery ui datepicker

    1.坑爹的jquery ui datepicker 竟然不支持选取时分秒,害的我Format半天 期间尝试了bootstrap的ditepicker,但是不起作用,发现被jquery ui 覆盖了, ...

  8. obfuscator-llvm Theos 集成配置

    之前我写过一篇文章是关于在 Xcode 里怎么集成配置 obfuscator-llvmobfuscator-llvm Xcode集成配置 有些情况下我们使用 Theos 开发 tweak,需要将 ob ...

  9. Flume采集目录及文件到HDFS案例

    采集目录到HDFS 使用flume采集目录需要启动hdfs集群 vi spool-hdfs.conf # Name the components on this agent a1.sources = ...

  10. python--模块之os操作文件模块

    作用:OS又名为:操作系统.所以就是操作系统相关的功能.可以处理文件和目录这些我们日常手动需要做的操作,比如:显示当前目录下所有文件.删除某个文件.获取文件大小...os模块是与操作系统交互的一个接口 ...