我有一个 WiX 安装程序,需要将文件安装到两个目录。在一个目录中,我们需要安装该文件的 32 位版本,在另一个目录中安装 64 位版本。
但是,这些文件具有相同的文件名,这似乎会导致 WiX 将它们合并在一起,并仅在 MSI 中存储单个副本。
基本上,我想要类似于以下的目录结构:
c:\Program Files\FooApp\MyLib.dll
c:\Program Files (x86)\BarApp\MyLib.dll
分别使用 32 位和 64 位版本的 MyLib.dll。
这两个文件当前位于我们的 .wxs 文件中,作为具有单独 ID 的单独 File 元素,并存储为单独的组件。但是,当我运行安装程序时,它会将 64 位版本的文件安装到两个位置,如果我使用 Dark.exe 提取 MSI 的内容,它还会显示两个组件具有相同的 Source 属性。
有没有办法说服 WiX 独立存储这两个文件并确保它们都安装到正确的目录?
虽然 WiX 确实有一个称为“智能出租车”的概念,它是基于校验和完成的。
您所看到的行为是由于不同的原因造成的:
Windows Installer 不支持单个安装程序中的 32 位和 64 位组件。 MSI 数据库是特定于平台的,Windows Installer 将通过“帮助”您修复 C:\Program Files 引用以指向它认为您要作为 32 位 MSI 部署到的 32 位位置来对您不利。
“正确”的解决方案是创建一个 32 位 msi 和一个 64 位 msi,并使用 WiX Burn 等引导程序将它们捆绑在一起。
如果您确实不想要 EXE 引导程序的复杂性并且只有 1 个文件要部署到 64 位程序文件文件夹,那么有一个颠覆性的 hack。我在过去几年中观察到,MSI 不够聪明,无法弄清楚 C:\Progra~1 实际上是 C:\Program Files,因此它不会尝试帮助您。
当我需要将文件部署到 32 位和 64 位 MSBuild 目录时,这个颠覆性的小技巧非常有用。
没有承诺它将来是否有效...它没有被 Microsoft 记录。