old*_*ast 5 installation windows-installer wix
我们正在尝试为我们的产品部署更新,其中包含更新的 dll。该 dll 也有一个版本号,因此通常安装程序应该能够看到它并替换旧的 dll。
Windows 安装程序在检查版本号时只关心前三个数字。然而,在这种情况下,更新后的版本号看起来与第四个版本号相同。例如,如果前一个版本为 1.0.0.12,则此版本为 1.0.0.20,因此安装程序会将它们视为相同版本,并且不会替换该文件。在这种情况下,我无法控制版本编号,并且由于我们包含了很多 dll,因此将来可能会再次发生这种情况。
无论版本号是否相同,如何让安装程序替换该文件?
在搜索不同的解决方案后,我尝试告诉安装程序在安装过程中删除该文件。如果没有必要,我不想删除所有文件。到目前为止,我已经尝试了包含的代码片段中所示的解决方案。该版本的安装程序中新增了删除文件元素。
<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>
Run Code Online (Sandbox Code Playgroud)
我期望的结果是旧的 dll 被新的 dll 替换,但是安装后旧的 dll 仍然存在,没有新的 dll。
类似的答案:未安装新组件的文件,因为旧组件具有相同的文件
伴随文件:如何在WiX中使用伴随文件- 只是一个片段(调试后发现 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>
<..>
Run Code Online (Sandbox Code Playgroud)
单行摘要:在第二个组件中,我们指向第一个组件的文件,以便每当安装 MyFile.exe 时都会安装 MyFile_2.exe - 无论版本控制问题如何。
下面的旧答案留下供参考和可用于测试的 WiX 源。
MSI 版本:Windows 安装程序在检查版本号时仅关心前三个数字。
文件版本与产品版本:上述陈述通常是正确的,但据我所知(并且基于快速冒烟测试),此 3 位数限制仅适用于 MSIProductVersion(MSI 本身的版本),而不适用到实际的file version numbers.
文件版本采用 4 位数字,而不是 MSI 的 3 位数字限制
ProductVersion(MSI 本身的版本)。请您亲自进行测试以确定。下面是执行此操作的示例 WiX 标记。
REINSTALLMODE:文件覆盖修饰符机制REINSTALLMODE可用于强制覆盖文件,无论版本如何。不得使用此机制,因为它可能会导致许多问题:在早期版本的 Windows 中,不必要的重新启动提示、系统共享文件降级、导致某些文件升级而其他文件不升级(新旧软件包安装顺序不正确)由于尝试降级受保护的文件等而崩溃......
WiX 模型测试源:我将在此处转储一个简单的测试 WiX 源,以帮助您快速测试(例如,在不同的操作系统版本上,我在 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>
Run Code Online (Sandbox Code Playgroud)
用法:
_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
Run Code Online (Sandbox Code Playgroud)
打开 EXE 作为资源:在 Visual Studio 中尝试以下操作:
File=> Open=>FileEXE, DLL, etc...)Open=>Open With...Resource Editor并打开文件。Version section、打开并双击条目。链接:
| 归档时间: |
|
| 查看次数: |
2134 次 |
| 最近记录: |