无法从MSI安装程序安装托管DLL程序集 - 错误1935 HRESULT = 0x800736FD

时间:2014-10-30 15:54:46

标签: wix windows-installer .net-assembly managed winsxs

我正在构建一个捆绑在MSI中的托管DLL以及相应签名的目录。 MSI安装无法报告程序集名称,processorArchitecture等。运行带有详细日志记录的MSIEXEC,显示如下:

  

MSI(s)(64:DC)[14:31:33:754]:程序集错误:HRESULT无法转换为相应的Win32错误代码。   MSI(s)(64:DC)[14:31:33:785]:注意:1:1935 2:{1ADE2A83-E905-4F35-9DD8-61F512CA50E8} 3:0x800736FD 4:IAssemblyCacheItem 5:提交6:BLAHBLAH,版本=" 10.0.62601.0",类型="的win32",ProcessorArchitecture用于=" 86"公钥=" 5f523ae7e6e1b389"   MSI(s)(64:DC)[14:31:33:785]:程序集错误(sxs):请查看位于-207342408ndir \ logs \ cbs \ cbs.log的基于组件的服务日志以获取更多诊断信息。   MSI(s)(64:DC)[14:31:33:785]:注意:1:2205 2:3:错误   MSI(s)(64:DC)[14:31:33:785]:注意:1:2228 2:3:错误4:SELECT Message FROM Error WHERE Error = 1935年   MSI(c)(7C:1C)[14:31:33:785]:创建字体。字符集:Req = 0,Ret = 0,字体:Req = MS Shell Dlg,Ret = MS Shell Dlg   错误1935.安装程序集时发生错误&BLAHBLAH,版本=" 10.0.62601.0",类型=" win32",processorArchitecture =" x86&# 34;公钥=" 5f523ae7e6e1b389"&#39 ;.有关更多信息,请参阅“帮助和支持”。 HRESULT:0x800736FD。汇编接口:IAssemblyCacheItem,function:Commit,component:{1ADE2A83-E905-4F35-9DD8-61F512CA50E8}   MSI(s)(64:DC)[14:31:48:019]:注意:1:2205 2:3:错误   MSI(s)(64:DC)[14:31:48:019]:注意:1:2228 2:3:错误4:SELECT Message FROM Error WHERE Error = 1709   MSI(s)(64:DC)[14:31:48:019]:产品:BLAHBLAH v10.0.62601.0 - 错误1935.装配期间发生错误' BLAHBLAH,版本=&# 34; 10.0.62601.0",类型="的win32",ProcessorArchitecture用于=" 86"公钥=" 5f523ae7e6e1b389"&#39 ;.有关更多信息,请参阅“帮助和支持”。 HRESULT:0x800736FD。汇编接口:IAssemblyCacheItem,function:Commit,component:{1ADE2A83-E905-4F35-9DD8-61F512CA50E8}   行动结束14:31:48:InstallFinalize。返回值3。

查看Windows / Logs / CBS.log,我可以看到:

  

2014-10-30 14:31:33,信息CSI 0000000c执行1次操作; 1没有锁定/解锁并遵循:     Install(5):flags:0 tlc:[BLAHBLAH,Version = 10.0.62601.0,pA = PROCESSOR_ARCHITECTURE_INTEL(0),Culture neutral,VersionScope neutral,PublicKeyToken = {l:8 b:5f523ae7e6e1b389},Type = [l:10 { 5}]" win32",TypeName中立,PublicKey中立])ref :( flgs:00000000 guid:{27dec61e-b43c-4ac8-88db-e209a8242d90} name:[l:0]"& #34; ncdata:[l:62 {31}]" C:\ Windows \ system32 \ msiexec.exe")thumbprint:[l:128 {64}]" c303b9f117203669bdfdbf904a7f1d45e4767da45615a08eff196fb02d093399"   2014-10-30 14:31:33,错误CSI 0000000d @ 2014/10/30:14:31:33.488(F)d:\ win7sp1_gdr \ base \ wcp \ library \ catalog.cpp(263):错误c000038a [错误,Facility =(系统),Code = 906(0x038a)]起源于函数CCatalog :: VerifyCertChainRoot表达式:HRESULT_FROM_WIN32((dwError))   [GLE = 0x80004005的]   2014-10-30 14:31:33,错误CSI 0000000e(F)c000038a [错误,设施=(系统),代码= 906(0x038a)]#1131#来自CCSDirectTransaction :: OperateEnding,索引0为1次操作,配置0 [GLE = 0xd000038a]   2014-10-30 14:31:33,错误CSI 0000000f(F)80090352 [错误,设施=(0009),代码= 850(0x0352)]#1001#来自Windows :: COM :: CComponentStore :: InternalTransact(。 ..)[GLE = 0x80090352]   2014-10-30 14:31:33,错误SXS Transact2失败,出现0x80090352

我看过很多报道说HRESULT 0x800736FD是内部错误,建议运行Windows系统更新准备工具。我已经做到了,但没有什么不同。

此处有人报告遇到相同问题但没有回复的人:

https://social.msdn.microsoft.com/forums/windowsdesktop/en-us/5938da72-16a4-46ef-9151-986b4bd6a60b/need-help-in-installing-dll-into-winsxs

我不认为托管DLL有任何问题,因为我可以使用gacutil手动将其安装到GAC中。

这让我疯狂。

2 个答案:

答案 0 :(得分:0)

好的,经过大量的反复试验后,我终于找到了问题。

我的MSI实际上是4个合并模块 - 需要安装在WinSxS中的非托管C ++ DLL,相应的VS2005运行时(不要问)以及需要在GAC中安装的托管C ++包装器。 / p>

其中一个合并模块(托管C ++包装器)与主MSI具有相同的名称,因此在报告错误消息时,我(天真地)认为这是错误的模块。当然,错误消息有点不分青红皂白 - 它实际上是失败的非托管C ++ DLL(具有不同的名称)。

失败的原因非常简单 - DLL清单中引用的公钥令牌是错误的。我错误地将用于托管C ++ DLL的强名称密钥的公钥标记放在那里,而不是代码签名证书的公钥标记。

不幸的是,这是一个错误小学生虽然,我几乎没有一个小学生。

令人讨厌的是,安装工具可以更明智地报告错误。

所以,如果你读了这篇文章并节省了很多时间,我很高兴。唉,对我来说,我已经失去了生命中的几天,我永远无法回来。

WinSxS,GAC,集会,舱单,yada,yada,yada。对我来说,这似乎太过复杂和脆弱。某个人,某个地方正好笑。

答案 1 :(得分:0)

我对第三方合并模块只有问题,尤其是你所说的。通常,最好重构并创建一个setup.exe bootstrapper / chainer来处理那些作为离散先决条件的安装。这样,当你安装MSI并且无论如何都没有连接到你的MSI时,它们就已存在。