如何使用 Wix 工具集在主要升级期间显式删除 dll
How to Explicitly Remove dll During Majorupgrade Using Wix Toolset
我们正在尝试为我们的产品部署更新,其中包含更新的 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 仍然存在并且没有新的。
Similar Answer:
配套文件:如何在WiX中使用Companion Files - 只是a 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>
<..>
一行总结:在第二个组件中,我们指向第一个组件的文件,以便 MyFile_2.exe 将安装每当安装 MyFile.exe - 无论版本控制问题如何。
下面留下较早的答案供参考和可用于测试的 WiX 源。
MSI Version: Windows installer only cares about the first three numbers when checking version number.
File Version vs ProductVersion:以上说法大体上是正确的,但据我所知(并且基于快速smoke test),这个3位数的限制只适用于MSI的ProductVersion
(MSI本身的版本),而不适用于实际的file version numbers
.
File versions are respected in 4 digits, as opposed to the 3 digit
limit for the MSI's ProductVersion
(the version for the MSI
itself). Please run a test yourself to be sure. Sample WiX markup to do so below.
REINSTALLMODE:文件覆盖修饰符机制REINSTALLMODE可用于强制覆盖文件,无论版本如何。一定不要使用这种机制,因为它会导致许多问题:不必要的重启提示、系统共享文件降级、导致某些文件升级而其他文件不升级(新旧包安装顺序不正确),在早期版本中 Windows 由于受保护的文件试图降级等而崩溃...
WiX 模型测试源:我将在此处转储一个简单的测试 WiX 源以帮助您快速测试(在不同的 OS 版本例如,我在 Windows 10):
上测试
Incidentally, due to some inherent design characteristics of this
sample, it will also illustrate that major upgrades fail when you only
bump up the last digit of the 4-digit version number, but file
overwrites will work. When you install version 2, you will find two product entries in Add / Remove Programs. This is expected based on the design of the sample. Just uninstall both.
<?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>
用法:
- 创建 WiX 项目,用上面的标记替换模板内容。
- 在 WiX 项目文件夹中创建一个名为
_Files
的子文件夹,并在该文件夹下创建两个子文件夹,其中包含同一文件的两个版本,如下图所示。
- 快捷方式: 在Visual Studio中,右击WiX项目,select
Open Folder in File Explorer
快速进入 WiX 项目文件夹。
- 现在粘贴或创建两个文件夹。
- 您可以打开 Visual Studio 中的 EXE 来“破解”版本号,这样您就可以在两个不同版本号的文件夹中使用相同的 EXE 或 DLL。有关信息,请参阅下面的部分。
- 将 MyVersion 定义更改为您要构建的版本号。例如:
<?define MyVersion = "23.4.5.2" ?>
。这也会影响样本期望源文件在磁盘上的位置。
- 更新 File 元素中的文件名以匹配版本化文件的名称 (
<File Source="$(var.MyReleasePath)MyTestFile.exe"></File>
)。
- 编译安装程序,安装它,检查安装文件的版本号。
- 更改 WiX 版本并编译下一个设置 (
<?define MyVersion = "23.4.5.3" ?>
)。
- 在现有安装之上安装。检查是否已安装新版本文件。
版本化文件的文件夹结构(在主项目文件夹中创建):
_Files
23.4.5.2\MyTestFile.exe
23.4.5.3\MyTestFile.exe
Open EXE as Resource:在 Visual Studio 中试试这个:
File
=> Open
=> File
- 浏览版本文件(
EXE
、DLL
、etc...
)
- 单击版本化文件一次(且仅单击一次)
- 单击
Open
按钮的向下箭头 => Open With...
- Select
Resource Editor
并打开文件。
- 找到
Version section
,打开并双击条目。
- 更改版本号,保存新文件版本(不在现有版本之上)。
链接:
- Forcing an upgrade of a file that is modified during its initial installation
我们正在尝试为我们的产品部署更新,其中包含更新的 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 仍然存在并且没有新的。
Similar Answer:
配套文件:如何在WiX中使用Companion Files - 只是a 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>
<..>
一行总结:在第二个组件中,我们指向第一个组件的文件,以便 MyFile_2.exe 将安装每当安装 MyFile.exe - 无论版本控制问题如何。
下面留下较早的答案供参考和可用于测试的 WiX 源。
MSI Version: Windows installer only cares about the first three numbers when checking version number.
File Version vs ProductVersion:以上说法大体上是正确的,但据我所知(并且基于快速smoke test),这个3位数的限制只适用于MSI的ProductVersion
(MSI本身的版本),而不适用于实际的file version numbers
.
File versions are respected in 4 digits, as opposed to the 3 digit limit for the MSI's
ProductVersion
(the version for the MSI itself). Please run a test yourself to be sure. Sample WiX markup to do so below.
REINSTALLMODE:文件覆盖修饰符机制REINSTALLMODE可用于强制覆盖文件,无论版本如何。一定不要使用这种机制,因为它会导致许多问题:不必要的重启提示、系统共享文件降级、导致某些文件升级而其他文件不升级(新旧包安装顺序不正确),在早期版本中 Windows 由于受保护的文件试图降级等而崩溃...
WiX 模型测试源:我将在此处转储一个简单的测试 WiX 源以帮助您快速测试(在不同的 OS 版本例如,我在 Windows 10):
上测试Incidentally, due to some inherent design characteristics of this sample, it will also illustrate that major upgrades fail when you only bump up the last digit of the 4-digit version number, but file overwrites will work. When you install version 2, you will find two product entries in Add / Remove Programs. This is expected based on the design of the sample. Just uninstall both.
<?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>
用法:
- 创建 WiX 项目,用上面的标记替换模板内容。
- 在 WiX 项目文件夹中创建一个名为
_Files
的子文件夹,并在该文件夹下创建两个子文件夹,其中包含同一文件的两个版本,如下图所示。
- 快捷方式: 在Visual Studio中,右击WiX项目,select
Open Folder in File Explorer
快速进入 WiX 项目文件夹。 - 现在粘贴或创建两个文件夹。
- 您可以打开 Visual Studio 中的 EXE 来“破解”版本号,这样您就可以在两个不同版本号的文件夹中使用相同的 EXE 或 DLL。有关信息,请参阅下面的部分。
- 将 MyVersion 定义更改为您要构建的版本号。例如:
<?define MyVersion = "23.4.5.2" ?>
。这也会影响样本期望源文件在磁盘上的位置。 - 更新 File 元素中的文件名以匹配版本化文件的名称 (
<File Source="$(var.MyReleasePath)MyTestFile.exe"></File>
)。 - 编译安装程序,安装它,检查安装文件的版本号。
- 更改 WiX 版本并编译下一个设置 (
<?define MyVersion = "23.4.5.3" ?>
)。 - 在现有安装之上安装。检查是否已安装新版本文件。
版本化文件的文件夹结构(在主项目文件夹中创建):
_Files
23.4.5.2\MyTestFile.exe
23.4.5.3\MyTestFile.exe
Open EXE as Resource:在 Visual Studio 中试试这个:
File
=>Open
=>File
- 浏览版本文件(
EXE
、DLL
、etc...
) - 单击版本化文件一次(且仅单击一次)
- 单击
Open
按钮的向下箭头 =>Open With...
- Select
Resource Editor
并打开文件。 - 找到
Version section
,打开并双击条目。 - 更改版本号,保存新文件版本(不在现有版本之上)。
链接:
- Forcing an upgrade of a file that is modified during its initial installation