5

我有一个 Windows 窗体应用程序,其中包含已使用 Visual Studio 创建的安装程序 (.msi)。我现在正在为 2.0 版创建一个新的安装程序,并将属性RemovePreviousVersions设置为 true。

现在,当我在 1.0 上安装 2.0 时,它会删除 1.0 并完全安装 2.0。

如果您发现某些文件已安装(例如用于数据的 .xml 文件),我是否可以告诉安装程序,然后不要覆盖它们?

我试图让我的 2.0 安装程序用于两个目的:

  • 为新用户从头安装
  • 现有用户将升级但不会丢失他们的自定义
4

2 回答 2

15

VS 中的部署项目不会覆盖文件。发生的情况是,由于您将 RemovePreviousVersions 设置为 true,因此当您更改程序文件版本和安装项目的 ProductCode GUID 时,它将首先卸载以前的版本,然后重新安装新版本。

为了确保某些文件不会被覆盖,我通常将它们从内容或主输出文件中排除(无论它们位于何处),然后将它们单独添加到安装项目中。这样做,您可以单独设置这些文件的属性。您要查找的属性称为“永久”,如果设置为 true,则永远不会卸载有问题的文件,因此永远不会用新版本覆盖它。唯一的缺点是,当您卸载产品时,永久文件不会从他们的目标位置删除,但在我的情况下(通常是本地数据库文件),这是一件好事;)

干杯!

[编辑] 以上对 VS 2008 SP1 是正确的。还没有在其他版本上尝试过,所以希望您使用的是相同的 VS 版本,或者它适用于您使用的版本。

[edit2] 哦,你也可以使用“条件”属性来实现类似的东西。如果这样做,请确保将“Transitive”设置为 True,以便始终评估 Condition。尚未尝试使用条件,但这是您可以查看的另一个选项。除了这两个之外,我认为这几乎是 VS 部署项目的内容。

于 2009-06-23T01:29:52.313 回答
2

当我处于类似情况时,我所做的是:

MSI 中不包含由每个用户自定义且不应被安装程序触及的文件(不包含在 Visual Studio 安装项目中)。当应用程序第一次运行时,我通过代码生成了 XML 文件。

我包含在 MSI 中的静态文件(例如,用于填充下拉列表的数据),我可以通过使用 Visual Studio 构建新的 MSI 来更新这些文件。

基本上不要在您的 MSI 项目中包含可自定义的文件。在代码中为新用户创建它们。

我从来没有考虑告诉 MSI 不要更新 MSI 文件中包含的某些文件。我想出的解决方案对我来说是完美的。我不知道是否可以做到。

我希望这有帮助。

于 2009-06-22T17:13:14.303 回答