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

时间:2019-02-19 09:49:44

标签: wix windows-installer

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

1 个答案:

答案 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>

用法

  1. 创建WiX项目,用上面的标记替换模板内容。
  2. 在WiX项目文件夹中创建一个名为 _Files 的子文件夹,并在该文件夹下另外创建两个带有相同版本的文件的子文件夹,如下所示。
    • 快捷方式 :在Visual Studio中,右键单击WiX项目,然后选择Open Folder in File Explorer以快速进入WiX项目文件夹。
    • 现在粘贴两个文件夹或创建它们。
    • 您可以在Visual Studio中打开EXE以“破解”版本号,以便在两个具有不同版本号的文件夹中使用相同的EXE或DLL。有关信息,请参见下面的部分。
  3. 将MyVersion定义更改为要构建的版本号。例如:<?define MyVersion = "23.4.5.2" ?>。这也会影响样本希望源文件位于磁盘上的位置。
  4. 更新File元素中的文件名以与版本文件(<File Source="$(var.MyReleasePath)MyTestFile.exe"></File>)的名称匹配。
  5. 编译设置,进行安装,检查已安装文件的版本号。
  6. 更改WiX版本并编译下一个设置(<?define MyVersion = "23.4.5.3" ?>)。
  7. 在现有安装之上安装。检查是否已安装新版本的文件。

版本文件的文件夹结构(在主项目文件夹中创建):

_Files
   23.4.5.2\MyTestFile.exe
   23.4.5.3\MyTestFile.exe

打开EXE作为资源 :在Visual Studio中,请尝试以下操作:

  1. File => Open => File
  2. 浏览版本文件( EXE DLL etc...
  3. 一次(仅一次)单击版本控制文件
  4. 单击 Open 按钮的向下箭头=> Open With...
  5. 选择 Resource Editor 并打开文件。
  6. 找到 Version section ,打开并双击条目。
  7. 更改版本号,保存新文件版本(不在现有文件的顶部)。

链接