1

我的问题:

我创建了两个合并模块。让我们称它们为 A 和 B。合并模块 B 依赖于 A。A 将 aaa.dll 并排安装到 Windows。B 包含 bbb.dll,它在安装过程中注册并依赖于 aaa.dll。作为旁注,合并模块 A 是在 Install shield 2012 中创建的,合并模块 B 是使用 Visual Studio 2010 向导创建的。

我有一个安装屏蔽项目,它安装了两个合并模块。我进入 Application Data-> Redistributables 并将 B 添加到安装中。这会自动检查 A。如果我转到 Organization->Setup Design 并展开包含 B 的功能,然后单击 B。它会显示有关 B 的信息的窗口。其中有一个正确列出 A 的 Dependencies 标题。

我构建项目并尝试将其安装在干净的 VM 上。在安装过程中我收到一条错误消息,说 bbb.dll 注册失败我想忽略,取消。此时我在机器上查看了winsxs,并注意到aaa.dll 不存在于它的正确文件夹中。相反,它存在于 winsxs\InstallTemp\ 子文件夹中。然后,如果我在错误弹出窗口上单击忽略,安装将继续,不会出现更多错误。然后完成后我可以手动注册 bbb.dll 就好了,并且 aaa.dll 存在于正确的 winsxs 子文件夹中。

我的问题是如何让合并模块 A 完全完成并将 aaa.dll 放置在正确的位置,以便一切都能正确安装?

我尝试过的事情:

  1. 我尝试在组织->设置设计下的安装盾项目中制作多个功能。所以我创建了 3 个功能。顶部的特征 1 仅包含 A。特征 2 包含 A 然后 B。最后特征 3 再次包含 A。我完成了所有 3 个必需的功能。我希望这意味着整个功能将完成安装并将 aaa.dll 放置在正确的并排位置。然而,没有这样的运气。(我创建了 3 个功能,以防万一我有倒序之类的东西)
  2. 我相当确定问题在于 aaa.dll 没有及时安装或安装在正确的位置。为了测试这一点,我首先尝试使用刚刚安装合并模块 A 的 install shield 安装程序安装 aaa.dll。然后我运行我的主安装程序,一切正常。

很抱歉文字墙和任何不正确的语法\拼写。如果我自己弄清楚这个问题,我会发布,以防其他人最终遇到这个问题,因为这真的很令人沮丧。

4

1 回答 1

3

以 WinSXS 和 GAC 为目标的文件直到提交阶段执行才真正安装,因为发布它们的 API 不支持回滚操作。这意味着,如果您在依赖于文件的 DLL 上使用自我注册到 WinSxS,它将无法工作,因为您有竞争条件。B.DLL 在调用 DllRegisterServer 时会尝试在 A.DLL 上执行 LoadLibrary(),但它不会找到它。

几种解决方法:

1)不要使用自我注册。最佳实践是在设计或构建时提取 COM 数据。

2) 将 A.DLL 部署到另一个目录,例如 INSTALLDIR。

3) 将 A.DLL 包装到它自己的 MSI 中,并将其连接到您的 MSI 作为设置的先决条件。这将在开始安装 MSI 之前将 A 安装到它自己的事务中。

于 2011-10-13T01:38:30.813 回答