安装程序不会覆盖现有应用程序

时间:2011-06-10 19:01:06

标签: visual-studio-2010 setup-project

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

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

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

有没有办法强制它覆盖?

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

9 个答案:

答案 0 :(得分:34)

如果您对安装有很好的控制,那么Visual Studio安装程序与商业产品甚至是WiX相比,并不是最友好的用户。

当您拥有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>

我希望你找到上面有用的

答案 1 :(得分:5)

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

答案 2 :(得分:4)

这是一篇很老的帖子,但是为可能会来寻找答案的人添加了这个帖子。

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

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

  1. 右键点击您的设置项目&gt;&gt;查看&gt;&gt;启动条件
  2. 右键点击“目标机器上的要求”&gt;&gt;添加文件启动条件
  3. 节点(“搜索File1”)将显示在“搜索目标计算机”下,另一个节点(“Condition1”)将显示在“启动条件”下
  4. 单击Search for File1并将其FileName属性更改为绑定为预先存在的内容(如“Notepad.exe”,几乎总是如此)
  5. 请注意,“Folder”设置为“[SystemFolder]”,“Property”设置为“FILEEXISTS1”
  6. 现在点击XYZ项目或任何其他节点的主要输出,然后在属性窗口中,将“条件”设置为“FILEEXISTS1”,与上面显示完全相同

答案 3 :(得分:4)

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

1)转到项目属性&gt;申请&gt;装配信息......

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

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

希望这有助于某人。

答案 4 :(得分:1)

AssemblyVersion&amp; AssemblyFileVersion 应该增加汇编(exe / dll)覆盖以及@shaun wilde提到的其他设置

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

  

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

不确定原因,但安装程序似乎在已安装新版本后运行先前版本的卸载。也许这是有原因的,但改变它似乎是我强制我的应用程序升级的唯一方法。

如果有其他人像我最近一样遇到这个问题,希望这个解决方法有所帮助。

答案 8 :(得分:0)

  • 经过长时间的研发,我找到了解决方案:

我遇到的问题:

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

原因:

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

解决方案:

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

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