如何让msi覆盖旧文件?

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

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

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

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

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

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

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

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

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

在不删除所有文件的情况下,检查[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时,这会更容易理解。 但首先,您需要正确卸载应用程序,然后才能进行升级。 如果无法正常卸载,则无法正常升级。

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

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

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

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