如何让msi覆盖旧文件?

时间:2009-03-23 16:59:29

标签: c# .net iis installer

我有一个标准的Visual Studio(2008)应用程序安装项目,它生成一个包含几个文件的msi。然而我注意到: 1)当msi安装并且某些文件已经存在时,它只是默默地忽略这些文件。由于显而易见的原因,这是我想要的行为。 2)当我卸载msi时,它不会删除我的主dll文件。

我该如何解决这两件事?它们一起使我们无法自动升级我的软件。

6 个答案:

答案 0 :(得分:4)

我遇到了完全相同的问题并最终放弃了。让它工作是一个涉及大量GUID的可怕而复杂的过程。之后你会觉得很脏(假设你让它上班)。

我的建议是切换到Inno Setup,它更适合像你我这样的人。

将.msi留给执行“公司推广”而不是“安装”的人。

答案 1 :(得分:3)

您是否增加了安装项目中的版本号?增加版本号也会要求您创建新的产品ID。你应该用是确认这个问题。

答案 2 :(得分:2)

当我测试使用MSI覆盖现有文件时,我遇到了类似的问题 - 现有的旧文件没有被MSI中的新文件替换。

我没有覆盖现有文件的新文件是版本化文件(它们是DLL),文件版本号没有改变,即使修改日期稍晚。一旦我将较新文件的文件版本号更改为比现有文件更高的版本,则现有文件被msi覆盖。

然后还有其他文件,如.manifest和.vsto,它们是由Visual Studio生成的,这些文件是无版本的,通常遵循installer versioning规则。这些都与DLL文件有关,并为每个.manifest,.vsto等文件提供了一个引用该DLL的CompanionFile属性。

答案 3 :(得分:1)

如果没有删除所有文件,请检查下面的引用计数 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs]

如果您使用MSIZAP又名“Windows Installer清理实用程序”,您基本上将您的计算机置于未知状态,并且您需要手动删除注册表中的所有内容(在我的公司中我们有一个实用程序,它可以从产品的最后10个版本中删除所有已知的注册表项,基本上包含1000行.reg文件和其他一些工具),然后才能再次可靠地测试您的设置。

有关当机器进入“不支持状态”时会发生什么情况以及在继续操作之前需要手动清理或重新格式化的更多信息,请参阅http://robmensching.com/blog/posts/2009/3/6/More-on-Haacks-Troubleshooting-Windows-MSI-Installers

我们遇到了这个问题,因为Installshield自动默认将组件设置为共享组件,因此我们最终会得到奇怪的引用计数错误,遗留的文件等等。这是一个非常难看的解决方案。

对于您的升级,尝试进行主要升级而不是轻微升级(补丁),因为当您第一次进入Windows Installer时,这是批次更容易理解。但首先,您需要正确卸载应用程序,然后才能进行升级。如果无法正常卸载,则无法正常升级。

答案 4 :(得分:1)

另一种选择是在应用程序的安装文件夹中包含版本号 将Application文件夹的默认位置设置为:

[ProgramFilesFolder]\\[ProductName]\\[ProductVersion]

同时将Setup项目的RemovePreviousVersions属性设置为true 这应删除旧版本的文件夹,并为新版本创建一个新文件夹 每次执行新版本时,请记住更改安装项目的版本属性。

答案 5 :(得分:0)

另一种选择是以编程方式卸载当前应用程序并安装新的msi 但是这需要一个自定义的winforms应用程序