最近使用 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();

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

 

4、设置安装部署项目相关参数

(1)DetectNewerInstalledVersion 屬性與 RemovePreviousVersions 屬性設定為 True

(2)设置安装部署项目Version+1

(3)提示是否需要更改Product Code时选择是

Copyright © 2024 チャチャの楽園
Powered by .NET 8.0 on Kubernetes