安装屏蔽-合并模块依赖问题.Dll未注册



我的问题:

我已经创建了两个合并模块。我们称它们为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添加到安装中。如果我进入组织->设置设计并展开包含B的功能,然后单击B,它会弹出关于B的信息窗口。在那里有一个Dependencies标题正确地列出了a。

我构建项目并尝试将其安装在干净的VM上。在安装过程中,我得到一个错误,说bbb.dll注册失败,我想忽略,取消。此时,我查看了机器上的winsxs,注意到aaa.dll不存在于它的适当文件夹中。相反,它存在于winsxsInstallTemp子文件夹中。然后,如果我在错误弹出框上单击"忽略",安装将继续,没有进一步的错误。然后在它完成后,我可以手动注册bbb.dll就好了,aaa.dll存在于适当的winsxs子文件夹中。

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

我尝试过的事情:

  1. 我试过在安装屏蔽项目中制作多个功能在组织->设置设计下。所以我创造了3个特征。功能1在顶部只包含A,特征2包含A和B。最后是特征3,再次包含A。我制作了全部3个功能必需的。我希望这意味着整个功能完成安装并将aaa.dll并排放置在正确的位置的位置。然而,没有这样的运气。(以防万一,我创建了3个功能我把顺序弄反了还是怎么的)
  2. 我相当肯定,问题是aaa.dll只是不安装及时,安装位置正确。为了测试这一点,我尝试安装aaa.dll首先使用安装屏蔽安装程序,只是安装合并模块a,然后我运行我的主安装程序,一切正常。

抱歉的文字墙和任何不正确的语法拼写。如果我自己解决了这个问题,我会把它贴出来,以防别人最终遇到这个问题,因为它真的很令人沮丧。

针对WinSXS和GAC的文件直到提交阶段执行时才真正安装,因为发布它们的API不支持回滚操作。这意味着如果你在一个依赖于文件进入WinSxS的DLL上使用Self Registration,它将无法工作,因为你有一个竞争条件。当调用DllRegisterServer时,b.d dll将尝试在a.d dll上执行LoadLibrary(),但它不会找到它。

解决方法:

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

2)将A.DLL部署到其他目录,如INSTALLDIR。

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

最新更新