如何在使用Wix Toolset进行专业升级期间显式删除dll

问题描述 投票:2回答:1

我们正在尝试对包含更新的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。

wix windows-installer installer
1个回答
3
投票

类似的答案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

用法

    创建WiX项目,用上面的标记替换模板内容。
  1. 在WiX项目文件夹中创建一个名为
  2. ProductVersion]的子文件夹,以及位于该文件夹下的另外两个子文件夹,其中相同文件的两个版本如下所示。
    • [Quick Way
:在Visual Studio中,右键单击WiX项目,然后选择REINSTALLMODE快速进入WiX项目文件夹。现在粘贴两个文件夹或创建它们。
  • 您可以在Visual Studio中打开EXE来“破解”版本号,因此您在两个文件夹中使用相同的EXE或DLL来使用不同的版本号。有关信息,请参见下面的部分。
  • 将MyVersion定义更改为要构建的版本号。例如:<?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> 。这也会影响样本希望源文件位于磁盘上的位置。
  • 更新File元素中的文件名以匹配版本文件(_Files)的名称。
  • 编译安装程序,进行安装,检查安装文件的版本号。
  • 更改WiX版本并编译下一个设置(Open Folder in File Explorer)。
  • 在现有安装之上安装。检查是否已安装新版本的文件。
  • 版本化文件的文件夹结构(在主项目文件夹中创建):

    <?define MyVersion = "23.4.5.2" ?>


    [作为资源打开EXE文件

    ]
  • :在Visual Studio中,请尝试以下操作:
    1. <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 浏览版本文件(
    2. File
    3. OpenFile一次(仅一次单击版本控制的文件)
    4. 单击
    5. EXE
    6. 按钮的向下箭头=> DLL选择
    7. etc...
    8. 并打开文件。
      找到
    9. Open
    10. ,打开并双击输入。
      更改版本号,保存新文件版本(不在现有文件的顶部)。

    11. 链接

      Open With...
    • Resource Editor
    © www.soinside.com 2019 - 2024. All rights reserved.