ClickOnce使用体会

    由于很少写Winform的程序,所以net2.0发布后,对于ClickOnce这个新特性,一直只是听说过没用过。直到最近有个小程序使用winform开发,使用了Clickonce的发布方式,发现它远没有想象中好用。因此写下自己的一些心得,希望对没用过的人有点帮助。
    一、ClickOnce的几个缺点:
    1,没有单独的项目类型。
    在“安装和部署”中没有这个项目类型,所以不能单见一个项目,只能在项目属性页的“发布”选项卡中使用,或者在项目节点的邮件菜单中直接启动向导使用。使用起来很不习惯。
    2,可控制性太差。
    尤其是包含的文件的下载状态,只有下载或不下载(需要时可以在程序中下载)。而且下载后的目录位置由FrameWork控制(在当前用户的目录中新添加了一个Apps目录Documents and Settings\Administrator\Local Settings\Apps),目录名是一大串,而且很多个目录,让人摸不着头脑,不知道这些目录的作用。
    3,数据文件的位置很离奇。
    如果程序中包含数据库文件,并且设置类型为数据文件,那么用户安装后的数据库文件被放到和程序不同的另外一个目录中,所以一定要注意这点。这将造成程序的不同分发方式,数据目录的位置是不同的,感觉很别扭。
    4,数据文件的分发策略。
    在ClickOnce的发布程序组选项中,有“数据文件”这一类型,可是我觉得微软的分发策略有问题,除了“自动将老版本的数据文件复制到新版本程序的数据目录中”这一特性外,其他的设定和别的文件类型一样,也就是说,如果地发布版本中的数据文件有变化,那么会自动下载并覆盖用户使用中的数据库文件,这对于涉及用户输入的程序来说简直是不可接受的!
    5,发布的程序竟然不压缩!
    这是我认为的ClickOnce发布中的最大缺点,发布的程序文件竟然不压缩,不打包,这对于大的程序来说简直是灾难,尤其国内的网络环境这麽差。另外,发布的文件是否添加“deploy”扩展名这个没用的设置竟然允许用户选择,简直很可笑,如果不加扩展名只会造成有些特殊的文件类型不能下载!
    以上就是我发现我认为的几个缺点,很有可能是我使用的有问题,希望有达人斧正。
    二、我总结的注意事项和小技巧:
    1,数据库文件的目录。
    我想大多数的应用程序都是离不开数据库的,对于.net的程序来说,Access的MDB或者SqlExpress数据库是我的选择。这里不得不说一下|DataDirectory|这个东东,详细请看我的另一随笔使用|DataDirectory| 的烦恼。现在发现在Winform程序中,尤其是要使用ClickOnce发布方式,你的数据目录千万不能叫做“App_Data”,这是正是因为ClickOnce发布的文件不打包,目录结构也是原样设置的,而“App_data”在IIS中是个犯忌的目录名字,目录下的文件不论什么权限都是不能下载的!我可是试验了多次才醒悟的!
    2,数据文件的分发。
    由于上面提到的ClickOnce分发数据文件的缺陷,我设想了两种解决方案:由于微软设置是如果是数据文件,那末只能输入"必需"的文件组,所以两种方案中数据库文件都不能设置为数据文件,而是将类型设置为"包括".
    第一种方案,为数据库文件建立一个单独的组,这样自动安装的时候就不会下载安装数据文件,可以在程序启动后,判断是否第一次运行,由于deploy.IsFirstRun的值,每次升级后也是True,所以还要判断一下数据目录中是否有文件(因为第一次下载数据文件后并存放到数据目录后,以后升级程序后,Framework会自动将旧的数据文件拷贝到新办程序的数据目录中).如果需要下载,那么就调用ApplicationDeployment.CurrentDeployment.DownloadFileGroup("Database");下载数据文件,下载完成后移动到数据目录中.
    第二种方案,考虑有可能是通过光盘进行分发,所以是把数据文件设置为"必需"组,然后经过上面同样的判断,然后确定是把数据文件移动到数据目录还是删除.
    目前我采用了第二种方案,不过由于ClickOnce分发不压缩打包,而数据库文件又比较大,所以每次升级都包括数据库文件有点浪费.
    以上就是我使用ClickOnce的一点儿体会,欢迎大家拍砖.~_~
   

posted @ 2007-08-31 12:11 大剑师 阅读(3618) 评论(10) 编辑 收藏

 回复 引用   
#1楼2007-10-11 12:54 | cppshooter[未注册用户]

客户端临时数据还有种解决方案:XML文件方式, 不依赖ClickOnce

 回复 引用 查看   
#2楼[楼主]2007-10-14 11:23 | 大剑师      
@cppshooter
我说的不是临时数据

 回复 引用   
#3楼2007-10-29 22:09 | cys[未注册用户]
楼主,发布时ACESS的数据库,该怎么包含在发布文件中.我的程序在"发布"应用程序配置里,并没有数据库文件..
紧急求救...

 回复 引用 查看   
#4楼[楼主]2007-10-30 12:22 | 大剑师      
@cys
选中“显示所有文件”的复选框自己添加即可

 回复 引用   
#5楼2008-03-14 14:51 | YJH[未注册用户]
您好,请问,ClickOnce能发布哪些类型的文件,我尝试着随程序一起发布一个txt文本文件,但郁闷的是,显示所有文件打上勾后也看不见它
 回复 引用   
#6楼2008-03-17 16:03 | dajianshi[未注册用户]
@YJH
没问题的啊

 回复 引用   
#7楼2008-05-20 20:31 | resuzu[未注册用户]
@dajianshi
确实有这个问题,点了所有文件也看不到的,你可以看到吗?

 回复 引用   
#8楼2008-05-22 22:30 | workjie-[未注册用户]
直接编辑 *.mainfest 文件就可以控制需要分发哪些文件(那么自然你就可以压缩文件,然后部署后自动再解压)
 回复 引用   
#9楼2008-11-14 19:32 | Huang.Qiming[未注册用户]
要发布的文件的[生成操作]属性改为 “内容”,就能看见了。
 回复 引用   
#10楼2009-05-31 16:48 | cdblh[未注册用户]
比如:
客户端下不同版本号的ClickOnce 程序是存在不同目录下的
那么当我对某一dll进行更新后。我希望只对该dll进行更新,用ClickOnce能实现吗?即clickonce能实现差异更新吗?如何实现呢?
如果不用clickonce实现自动更新,有更好、可操作性更强的方法吗?