安装Shield-合并模块依赖性问题。 Dll没有注册

时间:2011-10-12 18:05:14

标签: installshield side-by-side merge-module sxs

我的问题:

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

我有一个安装盾牌项目,可以安装两个合并模块。我进入Application Data-> Redistributables并将B添加到安装中。这会自动检查A.如果我转到Organization->设计设计并展开包含B的功能,然后单击B.它会打开窗口,其中包含有关B的信息。在那里有一个Dependencies标题,正确列出A. / p>

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

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

我试过的事情:

  1. 我尝试在Install Shield项目中创建多个功能 在Organization-> Setup Design下。所以我创建了3个功能。特色1 在顶部只包含A.功能2包含A然后B. 最后,功能3再次包含A.我做了所有3个功能 需要。我希望这意味着整个功能会 完成安装并将aaa.dll放在正确的并排中 地点。但是,没有这样的运气。 (我创建了3个功能以防万一 我向后退了订单或者其他东西)
  2. 我很确定问题是aaa.dll不是 安装在适当的时间或地点。为了测试这一点,我尝试首先使用刚刚安装了合并模块A的安装屏蔽安装程序来安装aaa.dll。然后我运行了我的主安装程序,一切正常。
  3. 对不起文字墙和任何不正确的语法\拼写。我会发布,如果我自己找出问题,以防其他人最终遇到这个问题,因为它真的很令人沮丧。

1 个答案:

答案 0 :(得分:3)

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

一些解决方法:

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

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

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

相关问题