我们正在尝试对包含更新的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。
类似的答案:File of a new component isn't installed because there was an old component with the same file
Companion Files:如何在WiX中使用Companion Files-只是snippet(在调试后,发现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>
<..>
[One-Line Summary:在第二个组件中,我们指向第一个组件的文件,以便无论何时安装MyFile.exe都将安装MyFile_2.exe,而不考虑版本问题。
下面留有较旧的答案,以供参考和可用于测试的WiX源。
MSI版本:Windows安装程序在检查版本号时仅关心前三个数字。
[File Version vs ProductVersion:上面的陈述通常是正确的,但据我所知(基于快速冒烟测试),此3位数字的限制仅适用于MSI的[ C0](MSI本身的版本),而不是实际的[[ProductVersion
。
文件版本以4位数字表示,而不是3位数字 MSI ProductVersion
的限制(MSI的版本 本身)。请确保自己进行测试。以下是WiX标记示例,请执行以下操作。
REINSTALLMODE:文件覆盖修改器机制file version numbers
可用于强制覆盖文件,而不考虑版本。不得使用此机制,因为它会引起许多问题:在Windows的早期版本中,不必要的重新引导提示,系统共享文件的降级,导致某些文件被升级而其他文件却没有(旧的和新的软件包不按顺序安装)。尝试降级受保护文件时崩溃,等等...
WiX Mockup测试源
:我将在此处转储一个简单的测试WiX源,以帮助您快速进行测试(例如,在不同的OS版本上,我在Windows 10上进行了测试):顺便说一句,由于此设计的某些固有设计特性, 示例,它也说明只有当您 增加4位版本号的最后一位,但文件 覆盖将起作用。安装版本2时,您会在“添加/删除程序”中找到两个产品条目。这是根据样本的设计预期的。只需卸载两者。
:用法
ProductVersion
]的子文件夹,以及位于该文件夹下的另外两个子文件夹,其中相同文件的两个版本如下所示。<?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
)。<?define MyVersion = "23.4.5.2" ?>
][作为资源打开EXE文件
<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
浏览版本文件(File
Open
,File
)一次(仅一次单击版本控制的文件)EXE
DLL
选择etc...
Open
链接
Open With...
Resource Editor