我们正在尝试将更新部署到包含更新的dll的产品中。该dll也具有版本号,因此通常安装程序应该能够看到该版本并替换旧的dll。
Windows安装程序在检查版本号时仅关心前三个数字。但是,在这种情况下,更新的版本号看起来与第四个数字相同。因此,例如,如果先前的版本具有1.0.0.12,则其版本为1.0.0.20,因此安装程序将它们视为相同版本,而不替换文件。在这种情况下,我无法控制版本编号,并且由于我们包含很多dll,因此将来可能会再次发生。
无论版本号是否相同,如何使安装程序替换文件?
在搜索了不同的解决方案之后,我试图告诉安装程序在安装过程中删除文件。如果不需要,我不想删除所有文件。到目前为止,我已经尝试了如随附代码段所示的解决方案。在此版本的安装程序中,removefile元素是新的。
<Component Id="SomeComponent" Win64="yes" Guid="*">
<File Id="SomeFile" KeyPath="yes" Source="$(var.app.TargetDir)\some.dll" />
<RemoveFile Id="RemoveSomeFile" Name="some.dll" On="install"/>
</Component>
我期望的结果是将旧的dll替换为新的dll,但是在安装后,旧的dll仍然存在并且没有新的dll。
答案 0 :(得分:2)
伴侣文件 :如何在 WiX 中使用Companion Files-只是一个片段(后调试发现,OP有一个需要降级文件的问题,而不是版本位数的问题-非常常见的问题):
<..>
<Component Id="MyFile.exe" Feature="Main">
<File Id="MyFile.exe" Source="MyFile.exe"></File>
</Component>
<Component Id="MyFile_2.exe" Guid="{0EBDFD64-017B-428F-BB67-3D82EA2A99AF}" Feature="Main">
<File Source="MyFile_2.exe" CompanionFile="MyFile.exe"></File>
</Component>
<..>
单行摘要 :在第二个组件中,我们指向第一个组件的文件,以便无论何时安装MyFile.exe都将安装MyFile_2.exe-与版本无关问题。
下面提供了较旧的答案供参考,以及可用于测试的WiX源。
MSI版本 :Windows安装程序在检查版本号时仅关心前三个数字。
文件版本与ProductVersion :上面的陈述通常是正确的,但据我所知(基于快速冒烟测试),该3位数字限制仅适用于MSI的ProductVersion
(MSI本身的版本),不适用于实际的 file version numbers
。
文件版本以4位数字表示,而不是3位数字 MSI
ProductVersion
(MSI版本)的限制 本身)。请确保自己进行测试。以下是WiX标记示例,可以这样做。
REINSTALLMODE :文件覆盖修改器机制REINSTALLMODE可用于强制覆盖文件,而不考虑版本。不得使用此机制,因为它会引起许多问题:在Windows的早期版本中,不必要的重新启动提示,系统共享文件的降级,导致某些文件被升级而其他文件却没有(旧的和新的软件包不按顺序安装)。尝试降级受保护文件时崩溃,等等...
WiX样机测试源 :我将在此处转储一个简单的测试WiX源,以帮助您快速进行测试(例如,在不同的OS版本上,我在Windows上进行了测试10):
顺便说一句,由于此设计的某些固有设计特征 示例,它也说明只有当您 增加4位版本号的最后一位,但文件 覆盖将起作用。安装版本2时,您会在“添加/删除程序”中找到两个产品条目。这是根据样本的设计预期的。只需卸载两者。
<?define MyVersion = "1.0.0.0" ?>
<?define MyReleasePath = "$(sys.SOURCEFILEDIR)_Files\$(var.MyVersion)\" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="FileVersioning" Language="1033" Version="$(var.MyVersion)"
Manufacturer="FileVersioning" UpgradeCode="{4864AA4A-EA1D-4367-8427-85D296B0A2A6}">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes" />
<Feature Id="Main" Title="FileVersioning" Level="1" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="FileVersioning">
<Component Feature="Main">
<File Source="$(var.MyReleasePath)MyTestFile.exe"></File>
</Component>
</Directory>
</Directory>
</Directory>
</Product>
</Wix>
用法 :
_Files
的子文件夹,并在该文件夹下另外创建两个带有相同版本的文件的子文件夹,如下所示。
Open Folder in File Explorer
以快速进入WiX项目文件夹。<?define MyVersion = "23.4.5.2" ?>
。这也会影响样本希望源文件位于磁盘上的位置。<File Source="$(var.MyReleasePath)MyTestFile.exe"></File>
)的名称匹配。<?define MyVersion = "23.4.5.3" ?>
)。版本文件的文件夹结构(在主项目文件夹中创建):
_Files
23.4.5.2\MyTestFile.exe
23.4.5.3\MyTestFile.exe
打开EXE作为资源 :在Visual Studio中,请尝试以下操作:
File
=> Open
=> File
EXE
, DLL
, etc...
)Open
按钮的向下箭头=> Open With...
Resource Editor
并打开文件。Version section
,打开并双击条目。链接 :