我有一个包含8个项目的Visual Studio 2010解决方案。它还有一个我用来创建安装的安装项目。
在客户端PC上首次安装时,它可以正常工作。但是,然后我修改了我的项目,并构建了一个新的安装程序,并将其传递给客户端。发生这种情况时,客户端必须首先手动卸载上次安装,然后运行安装程序。
如果他们运行安装程序,没有卸载,似乎它不会覆盖现有文件(exe和dll)。通常它只是被修改的exe。但是,它不会覆盖它。客户端计算机上的版本似乎保持不变。
有没有办法强制它覆盖?
请注意,当我修改我的主应用程序项目时,我会转到项目属性,程序集信息,并增加程序集版本以及文件版本。
答案 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文件夹并启动应用程序。这是一个简单的试验和错误。我不知道为什么它会以这种方式工作(我花了整整一夜的时间才想要弄出这些咖啡,我需要一些咖啡)。)。
答案 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)
我遇到的问题:
原因:
解决方案:
注意:如果您尝试了所有可能的方法,但仍然没有为解决方案提供资金,也请尝试一下。