Visual studio 2015 虽然现有文件是最新的,但升级时如何替换现有文件?

Visual studio 2015 虽然现有文件是最新的,但升级时如何替换现有文件?,visual-studio-2015,windows-installer,visual-studio-setup-proje,Visual Studio 2015,Windows Installer,Visual Studio Setup Proje,我使用Visual Studio 2015安装项目安装支持升级的应用程序。我完成了以下任务: 1) 我通过安装在程序文件位置复制了test.xml文件 2) 我今天修改了test.xml 3) 我为应用程序执行升级,客户要求将test.xml(无论是否最新)文件与包文件一起复制/重写(假设包文件昨天已修改) 由于现有文件是最新的,而不是包文件,所以安装根本不会过度写入该文件 因此,我尝试在OnBeforeInstall()中删除此文件,以便在OnAfterInstall()中复制新文件。但是,不

我使用Visual Studio 2015安装项目安装支持升级的应用程序。我完成了以下任务: 1) 我通过安装在程序文件位置复制了test.xml文件 2) 我今天修改了test.xml 3) 我为应用程序执行升级,客户要求将test.xml(无论是否最新)文件与包文件一起复制/重写(假设包文件昨天已修改)

由于现有文件是最新的,而不是包文件,所以安装根本不会过度写入该文件

因此,我尝试在OnBeforeInstall()中删除此文件,以便在OnAfterInstall()中复制新文件。但是,不幸的是,安装程序在复制文件后调用了自定义操作事件处理程序

然后,我发现有一个叫做

状况

我将其定义为1(True),这样无论现有文件的修改时间如何,安装程序都可以重写该文件。但这也没有成功。似乎在条件计算为true后,安装程序仍然应用文件时间戳检查,并且如果现有文件是最新的,则不会复制


因此,请让我知道是否有任何其他方式使这项工作

一些可能的解决方案:

  • 如果要通过添加所需的任何新数据进行升级,请安排安装程序更新现有Xml文件。Windows Installer不会覆盖更新的文件-没有人希望用空数据库替换满数据的数据库

  • 更改MSI文件(使用Orca等工具)。进入InstallExecuteSequence表,将RemoveExistingProducts操作从InstallFinalize之前(按顺序排序时)移动到InstallInitialize之后。这将在安装所有新文件之前完成旧产品的完全卸载,请确保对所有文件都有效

  • 您可以更改更新Xml文件的应用程序,以便在每次更新之后(或至少在升级之前),它将文件的创建时间戳设置为与修改时间戳相同。然后Windows Installer将假定它尚未更新,因此可以替换。您不能在自定义操作中执行此操作,因为正如您所发现的,在VisualStudio中,它们都是在安装文件后运行的

  • 不要在应用程序中使用已安装的Xml文件。向使用Xml文件作为模板的应用程序添加一些逻辑,首先运行时将其复制到某个地方,然后该副本就是实际使用的文件。然后,安装可以覆盖未更改的文件,应用程序可以再次复制并使用该文件


  • 很棒的建议!多谢。我用了tip.2,发现它很管用。但有一个问题是,每次我都需要在向客户移交之前修改MSI文件!我将RemoveExistingProducts的序列号更改为InstallInitialize的下一个,希望这就是我们需要做的。我不能使用Tip-1,因为大多数时候,我没有对XML文件进行任何修改。即使我引入了版本号或其他内容,并对每个版本不断进行修改,客户也不可能在我发布后立即使用我的版本,或者我无法阻止他们在我的版本发布后不修改XML文件。由于这个原因,我不能同时使用Tip-3。提示4:你能详细说明一下吗,我听不懂