【问题标题】:How can I make the msi overwrite old files?如何让 msi 覆盖旧文件?
【发布时间】:2009-03-23 16:59:29
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net iis installation


    【解决方案1】:

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

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

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

    【讨论】:

    • 嘿,这正是我所担心的。我已经在这些 msis 上浪费了 2 周时间。嗯,这只是另一件事 M$ 完全搞砸了。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        只要不删除所有文件,请检查下面的引用计数 [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 时,这很多更容易理解。但首先,您需要正确卸载您的应用程序,然后才能继续升级。如果不能正常卸载,就不能正常升级。

        【讨论】:

        • 要么使用,要么使用不需要所有这些的安装程序。
        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-01-16
            • 2016-02-12
            • 1970-01-01
            • 2020-10-31
            • 1970-01-01
            • 2018-08-08
            • 2015-12-15
            相关资源
            最近更新 更多