【发布时间】:2017-12-21 13:12:23
【问题描述】:
我们有一个 wix 安装项目,可以安装多个 COM dll 和一个使用 ServiceInstall 的服务。 COM dll 还具有使用 heat.exe 提取的关联注册表项,以避免 SelfRegCost 出现问题。
但是,两者似乎有冲突的要求:
- COM dlls 注册表项需要 'RemoveExistingProducts After="InstallInitialize"' 以避免在安装后卸载时擦除注册表信息,例如如果升级时修改了 dll 路径。
- 服务需要 'RemoveExistingProducts After="InstallExecute"'(或更高版本)以避免在升级时丢失服务帐户凭据。
我已经阅读了大量关于 msi、wix、服务和 COM 的相关问题/答案,但没有找到解决方案。
解决这个问题的正确方法是什么?
编辑:
安装程序使用“自动”生成的组件 GUID,并且每个组件只有一个文件。例外是由热量生成的 COM dll 组件,即:
<Component ...>
<File ...>
<TypeLib ...>
<Class ...>
...
</file>
<RegistryValue ... HKCR...>
...
</Component>
它有 2 个自定义操作,用于注册和取消注册 COM 服务器 (exe),因为我不知道还能做什么,因为热量无法提取它。
它确实将注册表项写入 HKCR 和 HKLM,但没有写入 HKCU。
它安装了约 20 个第三方文件 COM 文件 (.ocx),目前已安装到 System32 中。它还在我们自己的文件夹中安装了许多第三方文件。
然后它会在我们自己的文件夹中安装约 15 个专有 COM dll 和一些非 COM 文件(包括服务)。
该服务是使用默认帐户“LocalSystem”的 Wix“ServiceInstall”安装的,但用户在第一次安装后会更改此设置。我们不知道帐户信息。不幸的是,在许多情况下,该服务需要访问网络共享来读取大图像,所以我看不出这如何与内置帐户一起使用。
据我所知,没有共享文件。
我同意 RemomveExisting AfterInstallFinalize 更可取,所以如果我们可以让它与 COM 注册一起工作,那就太好了。
包括帮助文件(chm 和 pdf 177MB),它以 250MB 结尾。
更新
如果我们使用“AfterInstallFinalize”,服务问题将得到解决。然而,这给我们留下了 COM dll 问题。
我们创建了一个测试安装程序,它只安装一个 COM dll 及其相应的注册表项 (TypeLib...)。
正如预期的那样,如果组件没有被修改,升级时它可以正常工作。 IE。 dll路径和自动生成的component-guid都没有改变。
但是,如果修改了 dll 路径,实际上我们安装了一个新组件,那么相关的 COM 注册表项在安装后会被删除,可能是通过 RemoveExistingProducts。我们尝试使用自动生成的 guid,并将其硬编码为与之前安装的 guid 相同的 guid。
问题似乎是 dll 路径发生了变化,但大多数注册表项都没有。例如。所有“类”键都丢失了。这就是我说“擦除注册表信息”时的意思。修复安装会恢复 COM 注册表项。
所以我想我的问题可以归结为: 我们如何正确安装/更新 COM dll,以便在更改文件路径时不会卸载 COM 注册表项?这可以使用 REP=AfterInstallFinalize 吗?
【问题讨论】:
-
非常感谢大家的帮助。有很多信息需要我去消费,我试过了再回来。
-
从以上判断,老实说,您的安装程序应该已经可以正常工作了。我肯定错过了什么。您确定所有 COM 服务器都启用了自动 GUID 吗?您确定 COM EXE 注册的自定义操作正常工作吗?这些是如何调节和排序的?它们是作为什么实现的?脚本?批处理文件?动态链接库?可执行文件?这是一个正常大小的设置——听起来很普通。任何 .NET COM 互操作?任何GAC安装?我确实相信内置帐户可以访问网络共享,但我从未尝试过。可以尝试 NetworkService - 然后您作为机器访问。
-
您声明 COM dll 的 dll 路径可能会在升级时被修改。为什么会发生这种情况,频率如何?如果这些是自动 GUID 组件,它实际上应该仍然可以工作 - 至少在自我修复之后。这是怎么回事?您更新然后在该 COM 组件的实例化时调用自我修复?如果是这种情况,那么我希望我能看到源代码或至少两个编译的 MSI 文件(版本 1 和 2)来确定实际发生了什么。
-
您解决了这个问题吗?
-
对不起,我还没有机会尝试它,因为我在假期中离开了。我期待下周尝试您的建议。
标签: wix windows-installer