Wix Toolset:从另一个安装程序中删除一个安装程序的内容

时间:2018-01-10 16:31:01

标签: wix windows-installer

我有两个安装程序:

  1. 安装程序A安装A.dll v1.0.0.0
  2. 安装程序B将A.dll更新为v2.0.0.0
  3. 当我卸载B时,它不会删除A.dll。还有A.dll版本2.0.0.0

    A.dll(v2.0.0.0)只能从安装程序A中删除。

    安装程序具有不同的UpgradeCode和Component ID。

    如何从安装程序B中删除产品的替换内容?

1 个答案:

答案 0 :(得分:2)

两个设置之间共享的文件(文件由两个设置安装到相同的绝对路径)必须维护单个稳定的组件GUID,以允许Windows Installer引用计数正常工作。在Windows Installer中实现此功能的机制是 merge module 。 WiX以自己的方式使用 WiX include file 方法处理共享文件。

我前面写了一篇回答,其中包含有关合并模块和WiX包含文件的更多信息:WiX 3.8: Two MSI using the same registry values. How to delete registry values only if both MSI are uninstalled?

如果您需要在不同的应用程序中使用不同版本的dll,那么它们应该安装到每个应用程序的私有位置,并且它们应该具有不同的组件GUID:

ProgramFilesFolder\MyCompanyFolder\MyApp1\MyExe.exe version 1.0.0
ProgramFilesFolder\MyCompanyFolder\MyApp1\MyDll.dll version 1.0.0

ProgramFilesFolder\MyCompanyFolder\MyApp1\MyExe.exe version 2.0.0
ProgramFilesFolder\MyCompanyFolder\MyApp2\MyDll.dll version 2.0.0

或者,您可以将它们安装到单独文件夹中的共享位置,并通过清单正确绑定:

CommonFilesFolder\MyCompanySharedFiles\1.0\MyExe.exe version 1.0.0
ProgramFilesFolder\MyCompanyFolder\MyApp1\MyDll.dll version 1.0.0

CommonFilesFolder\MyCompanySharedFiles\2.0\MyExe.exe version 2.0.0
ProgramFilesFolder\MyCompanyFolder\MyApp2\MyDll.dll version 2.0.0

CommonFilesFolder\MyCompanySharedFiles\2.5\MyExe.exe version 2.5.8
ProgramFilesFolder\MyCompanyFolder\MyApp2\MyDll.dll version 2.0.0

您可以使用单独的MSI部署共享文件,以便可以在不重新编译主MSI的情况下更新它们,也可以使用合并模块将共享文件编译到主MSI中(静态链接类型)。

最后,如果共享文件是.NET程序集(但不是),则可以将共享文件安装到GAC:

或者您可以将本机Win32文件安装到 WinSxS并排文件夹。对于本机文件,您还可以在System32或SysWOW64或其他非并排但共享的文件夹中安装共享。

此处有类似的答案: Wix Toolset: How to restore replaced file on uninstall 。比上面的描述更精细。

以下是对Windows Installer组件引用如何真正起作用的相当全面(且详见不详)的描述: How exactly are files removed during MSI uninstall?

最后回答了一些关于如何通过使用默认属性和启用自动组件GUID生成来改进和简化WiX文件的建议。强烈建议您查看: Continue the Wix setup after having a service that could not start 。不要让标题混淆你,这是通用的WiX建议。我特别建议查看自动组件GUID功能,因为它可以帮助您正确地进行组件GUID分配。