【转】Visual Studio 2008 安装部署项目程序升级,windows服务安装以及User Setting的说明
Posted on 2010-11-04 15:27 チャチャの楽園 阅读(1462) 评论(0) 编辑 收藏 举报1、 安装程序升级版本号后,安装完成却发现并没有升级程序。
2、 升级windows服务时,提示 “服务已经存在”,中止安装。
3、 升级后,User Setting配置数据恢复到默认值,并没有继承上一版本配置数据。
经过反复测试我确认是VS2008有了新的改动。
在网上找了很多时间,发现国内还几乎没有人提出这个问题。在国外的一些论坛里,也有人发现了和我一样的问题,并进行了一定的讨论。通过总结和大量实验,我总算圆满解决以上三个问题。
一、VS2008安装部署项目的最新改动
VS2008帮助文档明确说明,VS2008在安装部署方面与VS2005不同。综合各种资料,总结如下:
VS2005 安装程序,先完全卸载旧版本,然后全新安装新版本。
VS2008 安装程序,则只是升级,没有卸载旧版本。安装程序只是更新确实需要更新的文件,在最后安装新文件的时候,才删除旧文件。
在MSI文件安装过程中旧版本文件的删除是在 InstallExecute 和 InstallFinalize. 之间执行,而不是在一开始就执行。
可以参考 http://msdn2.microsoft.com/en-us/library/aa371197(VS.85).aspx
文件根据File versioning rules 进行升级。虽然 File Version 对 VS生成的MSI文件没有影响。文件的修改日期不能作为升级的依据。
可以参考 http://msdn2.microsoft.com/en-us/library/aa368599(VS.85).aspx
VS并没有对文件进行hash处理。
所以,如果仅仅升级了安装程序的Version,没有升级程序集的File Version,安装程序将不会对这些文件进行升级。
二、解决方法
1、 程序安装后并没有升级的问题
解决的关键就是,必须升级程序集的File Version。
最简单的办法:修改解决方案中的所有 AssemblyInfo.cs 文件 最后两行
[assembly: AssemblyFileVersion("1.0.0.1")]
为
这样,每次编译都会升级AssemblyVersion, 由于没有指定AssemblyFileVersion, 其默认等于 AssemblyVersion,所以每次编译也会自动升级。
注意,这里 1.0.* 格式并不适用于AssemblyFileVersion。
对于以vsdpaLoose形式打包的普通文件,只要有过修改,就会在升级或者修复中被更新。
另外,还可使用第三方插件,更好的管理整个解决方案的Version。
2、 Windows服务升级的问题
由于新版安装过程中并没有卸载旧版本,服务也没有卸载,所以在新版本安装过程中,安装服务时,就会提示“服务已经存在”的错误。
给windows服务的 Custom Action -〉Install 添加Conditon:
NOT PREVIOUSVERSIONSINSTALLED AND Not Installed
说明:NOT PREVIOUSVERSIONSINSTALLED 确保升级安装时不会重新安装windwos服务
Not Installed 确保在修复安装时,不会重新安装windwos服务
具体的Condition语法可以参考
http://msdn2.microsoft.com/en-us/library/aa368012.aspx
3、 User Setting升级的问题
VS2005种程序升级后,User Setting配置数据,仍然使用上一版本的,但在VS2008种,升级后的程序配置文件将恢复到默认值。其实并未覆盖旧版本的,而是每个版本都有独立的配置文件夹,互不影响。
如果需要在程序升级后,继续使用旧版本的配置,则可以使用以下办法解决:
在程序第一次运行时调用
Settings.Default.Save();
当然,需要自己控制该段代码只运行一次。
4、设置安装部署项目相关参数
(1)DetectNewerInstalledVersion 屬性與 RemovePreviousVersions 屬性設定為 True
(2)设置安装部署项目Version+1
(3)提示是否需要更改Product Code时选择是