【问题标题】:Installer won't overwrite existing app安装程序不会覆盖现有应用程序
【发布时间】:2011-06-10 19:01:06
【问题描述】:

我有一个包含 8 个项目的 Visual Studio 2010 解决方案。它还有一个我为创建安装而构建的安装项目。

在客户端 PC 上首次安装时,它运行良好。但是,我随后修改了我的项目,并构建了一个新的安装程序,并将其传递给客户端。发生这种情况时,客户端必须首先手动卸载上次安装,然后运行安装程序。

如果他们在没有卸载的情况下运行安装程序,它似乎不会覆盖现有文件(exe 以及 dll)。通常它只是被修改的exe。但是,它不会覆盖它。客户端计算机上的版本似乎保持不变。

有没有办法强制覆盖?

请注意,当我修改我的主应用程序项目时,我会转到项目的属性,程序集信息,并增加程序集版本以及文件版本。

【问题讨论】:

标签: visual-studio-2010 setup-project


【解决方案1】:

与商业产品或 WiX 相比,Visual Studio 安装程序不是最友好的,如果您希望对安装进行良好的控制。

当你有一个 Visual Studio 安装项目时,你有几个属性参与升级过程

1) 升级代码 - 这是同类安装程序之间的链接,您不应不必要地更改此代码

2) 版本号 - 奇怪的是只有前 3 个数字 (major.minor.build) 用于比较(这是很多开发人员常犯的错误)

3) 产品代码 - 一旦您更改版本号 VS 会提示您更改此编号 - 执行此操作 - 如果您自动更改编号,请记住也要这样做

4) DetectNewerInstalledVersion - 设置为 True

5) RemovePreviousVersions - 设置为 True

我个人会考虑使用 WiX 进行如此小的安装,即如果您可以在 Visual Studio 中进行安装,那么使用 WiX 版本

我的 OpenCover 安装程序如下所示

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" >

<Product Id="*" Name="OpenCover" Language="1033" Version="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)" 
        Manufacturer="OpenCover @ GitHub" UpgradeCode="2250c3f1-d9ba-44d8-b4db-25f91fe92dc6">

    <Package InstallerVersion="200" Compressed="yes" />

    <Upgrade Id="2250c3f1-d9ba-44d8-b4db-25f91fe92dc6">
        <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND" Minimum="1.0.0.0" IncludeMinimum="yes"
                        Maximum="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)" IncludeMaximum="no" />

        <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)"
                        IncludeMinimum="yes" />
    </Upgrade>

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

...

</Wix>

希望以上内容对你有用

【讨论】:

  • AssemblyVersion 和 AssemblyFileVersion 的程序集应与您提到的设置一起更改以进行覆盖。
【解决方案2】:

在安装项目的属性中,更改版本/内部版本号。这将提示您允许生成新的 GUID。这样做会告诉安装程序您有一个新版本,并允许自动删除旧版本的程序并由 MSI 系统安装新版本。

【讨论】:

  • 这不会让安装者认为这是一个不同的产品吗? (即更改 GUID)?
  • @cdotlister:老实说,我不完全理解,但这是我理解的方式。安装程序有一个独立于正在安装的产品的 GUID。您必须更改安装程序项目中的 GUID,以便它知道您正在安装 GUID 未更改的产品的新版本。如果您不这样做,安装程序会认为您正在尝试修复以前的版本。我可能遗漏了一些细微差别,或者可能与它为什么起作用但它确实起作用有关。抱歉,我在这里无法提供更多帮助,但也许其他人可以甚至谷歌。
  • @Craig UpgradeCode 是 GUID,用作同一产品的不同版本(具有不同 ProductId)之间的通用 ID。
【解决方案3】:

我也遇到了 .exe 没有更新的问题,尽管按照上述步骤操作。 .exe 的产品版本似乎不会自动遵循设置属性中设置的版本号。对于运行新安装程序时要替换的 .exe,按如下方式递增产品版本:

1) 转到项目属性 > 应用程序 > 装配信息...

2) 增加程序集和文件版本号

3) 再次构建安装程序,安装程序应该会覆盖旧的 .exe

希望这对某人有所帮助。

【讨论】:

  • 您不需要增加程序集版本,只需增加文件版本。文件版本默认为 AssemblyVersion,但这会搞砸绑定到程序集的客户端。只需增加 AssemblyFileVersion,您就可以不理会 AssemblyVersion。
【解决方案4】:

这是一篇旧帖子,但为可能来寻找答案的人添加此帖子。

即使在遵循here 的所有内容之后,我也遇到了这个问题。我的问题是 C# 程序的版本无论如何都不会在每次构建时增加。即使我手动编辑了 AssemblyInfo.cs,生成的 exe 版本仍然是 1.0.0.0。因此,安装程序不会替换该文件。

解决方法是将启动条件添加到设置项目的“XYZ 项目的主要输出”(或您想要覆盖的任何内容)节点。这会导致安装程序在运行较新的安装程序时删除该文件。现在,当用户启动应用程序时,会出现一个窗口,说明正在配置应用程序,将较新的文件复制到应用程序文件夹并启动应用程序。这是简单的试验和错误。我不知道它为什么会这样(而且我花了一整夜试图弄清楚这一点后我需要喝杯咖啡:))。

  1. 右键单击您的设置项目>>查看>>启动条件
  2. 右击“目标机要求”>>添加文件启动条件
  3. 一个节点(“Search for File1”)将出现在“Search Target Machine”下,另一个节点(“Condition1”)将出现在“Launch Conditions”下
  4. 单击搜索 File1 并将其 FileName 属性更改为绑定到预先存在的内容(例如“Notepad.exe”,几乎总是这样)
  5. 请注意,“Folder”设置为“[SystemFolder]”,“Property”设置为“FILEEXISTS1”
  6. 现在单击来自 XYZ 项目或任何其他节点的 Primary Output,然后在属性窗口中,将“Condition”设置为“FILEEXISTS1”,就像上面显示的那样

【讨论】:

  • 这似乎不适用于基于非 exe 的产品 - 我尝试使用 Office 的 VSTO 插件,但这并没有解决问题 :-(
  • 啊,太糟糕了。我终于放弃了 VS Setup 项目,转而使用 NSIS 安装程序(当时我还在做这个项目)。
  • 我找到了另一个解决方案 - 确保每个安装包的所有 dll 文件版本都更改。在我的情况下,我更改了我的解决方案以在解决方案中的所有 VSTO 项目中使用共享的 AssemblyInfo 文件,然后在每次创建新的安装包时增加版本号。或者将 AssemblyVersion 设置为 auto(1.0.* 或类似)并且不要设置 AssemblyFileVersion(强制它使用 AssemblyVersion)。这也会更改所有 dll 文件的版本,确保它们将在安装包中被替换。
  • 更多关于如何在此处设置和使用共享 AssemblyInfo 文件的信息:weblogs.asp.net/ashishnjain/…
  • 酷。真可惜,像设置项目这样关键的东西必须有这么多的箍要跳过:|
【解决方案5】:

AssemblyVersion 和 AssemblyFileVersion 应增加程序集 (exe/dll) 覆盖以及@shaun wilde 提到的其他设置

【讨论】:

    【解决方案6】:

    我遇到了同样的问题。确保这一点的最佳方法是确保您的可执行文件,即 Application.exe 本身的版本高于之前的版本。

    只需点击项目属性(不是设置项目),然后将应用程序版本设置为更高版本。

    【讨论】:

      【解决方案7】:

      稍微改进一下答案,您必须增加文件版本以使 Windows 安装程序在更新期间覆盖。这不一定与某些人指出的增加程序集版本相同。只有文件版本需要递增,而使用托管代码,您可以使用 AssemblyFileVersion 执行此操作。文件版本默认为程序集版本,但是当您拥有依赖于特定 AssemblyFileVersion 的客户端程序集时,AssemblyFileVersion 允许您使它们不同。

      【讨论】:

        【解决方案8】:

        文件未覆盖时遇到类似问题。检查版本号,产品/升级代码,一切。最终帮助我的是this post at MSDN。特别是这里的部​​分,当使用 Orca 检查 msi 文件时:

        我还将 >InstallExecuteSequence 表中 RemoveExistingProducts 的序列从 6550 更改为 1525(在 InstallExecute 之后到 >InstallInitialize 之后)。

        不知道为什么,但安装程序似乎在安装了新版本后会运行旧版本的卸载。也许是有原因的,但改变它似乎是我可以强制我的应用程序升级的唯一方法。

        如果其他人像我最近一样偶然发现此问题,希望此解决方法有所帮助。

        【讨论】:

          【解决方案9】:
          • 经过长时间的研发,我找到了解决办法:

          我遇到的问题:

          1. 每当我从本地安装新版本的工具时,都不会更新现有工具(在控制面板中检查),而是为同一工具安装新版本。

          原因:

          1. 无法将我本地发布的工具版本映射到 Live 位置的版本。

          解决方案:

          1. 请确保您在实时驱动器上拥有该工具的最新发布副本。

          注意:如果您已经尝试了所有可能的方法,但仍然没有为解决方案提供资金,请也尝试一下。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-05
            • 1970-01-01
            • 2016-06-22
            相关资源
            最近更新 更多