我有一个Windows Forms应用程序,其中包含已使用Visual Studio创建的安装程序(.msi)。我现在正在为版本2.0创建一个新的安装程序,其属性RemovePreviousVersions
设置为true。
现在,当我在1.0上安装2.0时,它会删除1.0并完全安装2.0。
如果您发现某些文件已经安装(比如用于数据的.xml文件),我是否有办法告诉安装程序,然后不要覆盖它们?
我正在努力让我的2.0安装程序达到以下两个目的:
答案 0 :(得分:13)
VS中的部署项目不会覆盖文件。会发生什么情况,因为您将RemovePreviousVersions设置为true,当您更改程序文件版本和安装项目的ProductCode GUID时,它将首先卸载以前的版本,然后执行新版本的全新安装。
为确保某些文件不会被覆盖,我通常会将它们从内容或主要输出文件(无论它们位于何处)中排除,然后将它们分别添加到安装项目中。这样做,您可以单独设置这些文件的属性。您正在寻找的属性称为永久“如果设置为true将永远不会卸载有问题的文件,因此永远不会用新版本覆盖它。唯一的缺点是当您卸载产品时,永久文件不会从目标位置删除,但在我的情况下(通常是本地DB文件),这是一件好事;)
干杯!
[edit]以上适用于VS 2008 SP1。没有在其他版本上尝试过,所以希望你使用相同的VS版本,或者它适用于你使用的版本。
[edit2]哦,你也可以使用“Condition”属性来实现类似的功能。如果这样做,请确保将“Transitive”设置为True,以便始终评估Condition。没有尝试过条件,但这是你可以看到的另一种选择。除了这两个,我认为这几乎适用于VS部署项目。
答案 1 :(得分:2)
当我处于类似的情况时,我所做的是:
每个用户自定义且安装程序不应触及的文件未包含在MSI中(不在Visual Studio安装项目中)。当应用程序第一次运行时,我通过代码生成了XML文件。
静态文件(例如用于填充下拉列表的数据)我包含在MSI中,我可以通过使用Visual Studio构建新的MSI来更新这些文件。
基本上不要在MSI项目中包含可自定义的文件。在代码中为新用户创建它们。
我从未考虑过告诉MSI不要更新MSI文件中包含的某些文件。我想出的解决方案对我来说是完美的。我不知道是否可以做到。
我希望这会有所帮助。