博客园  :: 首页  :: 联系 :: 管理
      最近使用 VS2008的安装部署项目时,发现了很奇怪的问题:

            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: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion(
"1.0.0.1")]


[assembly: AssemblyVersion("1.0.*")]

 这样,每次编译都会升级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升级的问题

VS
2005种程序升级后,User Setting配置数据,仍然使用上一版本的,但在VS2008种,升级后的程序配置文件将恢复到默认值。其实并未覆盖旧版本的,而是每个版本都有独立的配置文件夹,互不影响。
如果需要在程序升级后,继续使用旧版本的配置,则可以使用以下办法解决:

在程序第一次运行时调用

            Settings.Default.Upgrade();

            Settings.Default.Save();

当然,需要自己控制该段代码只运行一次。