我正在构建一个托管DLL,该DLL与适当签名的目录捆绑在MSI中。MSI安装无法报告程序集名称、processorArchitecture等。使用详细日志记录运行MSIEXEC时,显示以下内容:
MSI(64:DC)[14:31:33:754]:程序集错误:无法将HRESULT转换为相应的Win32错误代码。MSI(64:DC)[14:33:785]:注意:1:1935 2:{1ADE2A83-E905-4F35-9DD8-61F512CA50E8}3:0x800736FD 4:IAssemblyCacheItem 5:提交6:BLAHBLAH,版本="10.0.262001.0",类型="win32",processorArchitecture="x86",publicKeyToken="5f523ae7e6e1b389"MSI(64:DC)[14:31:33:785]:程序集错误(sxs):请查看位于207342408ndir\logs\cbs\cbs.Log的基于组件的服务日志,以获取更多诊断信息。MSI(64:DC)[14:33:785]:注意:1:2205 2:3:错误MSI(64:DC)[14:33:785]:注意:1:2228 2:3:错误4:从
Error
中选择Message
,其中Error
=1935MSI(c)(7C:1C)[14:33:785]:字体已创建。字符集:Req=0,Ret=0,字体:Req=MS外壳Dlg,Ret=MS外壳数据lg错误1935。安装程序集"BLAHBLAH,版本="10.0.62601.0",类型="win32",processorArchitecture="x86",publicKeyToken="5f523ae7e6e1b389"时出错。有关详细信息,请参阅"帮助和支持"。HRESULT:0x800736FD。程序集接口:IAssemblyCacheItem,函数:Commit,组件:{1ADE2A83-E905-4F35-9DD8-61F512CA50E8}MSI(64:DC)[14:31:48:019]:注意:1:2205 2:3:错误MSI(64:DC)[14:31:48:019]:注意:1:2228 2:3:错误4:从Error
中选择Message
,其中Error
=1709MSI(64:DC)[14:31:48:019]:产品:BLAHBLAH v10.0.62601.0--错误1935。安装程序集"BLAHBLAH,版本="10.0.62601.0",类型="win32",processorArchitecture="x86",publicKeyToken="5f523ae7e6e1b389"时出错。有关详细信息,请参阅"帮助和支持"。HRESULT:0x800736FD。程序集接口:IAssemblyCacheItem,函数:Commit,组件:{1ADE2A83-E905-4F35-9DD8-61F512CA50E8}操作结束14:31:48:InstallFinalize。返回值3。
查看Windows/Logs/CBS.log,我可以看到:
2014-10-30 14:31:33,Info CSI 0000000 c执行1次操作;1未锁定/解锁并遵循:安装(5):标志:0 tlc:[BLAHBLAH,Version=10.0.62601.0,pA=PROCESSOR_ARCHITECTURE_INTEL(0),区域性中立,VersionScope中立,PublicKeyToken={l:8 b:5f523ae7e6e1b389},Type=[l:10{5}]"win32",TypeName中立,PublicKey neutral])引用:(flgs:000000000 guid:{27dec61e-b43c-4ac8-88db-e209a8242d90}名称:[l:0]"ncdata:[l:62{31}]"C:\Windows\system32\msiexec.exe")指纹:[l:128{64}]"c303b9f117203669bdfdbf904a7f1d45e4767da45615a08eff196fb02d093399"2014-10-30 14:31:33,错误CSI 0000000 d@2014/10/30:14:31:33.488(F)d:\win7sp1_gdr\base\wcp\library\contolog.cpp(263):错误c000038a[Error,Facility=(system),Code=906(0x038a)]源自函数CCatalog::VerifyCertChainRoot表达式:HRESULT_FROM_WIN32((dwError))[gle=0x80004005]2014-10-30 14:31:33,错误CSI 0000000 e(F)c000038a[Error,Facility=(system),Code=906(0x038a)]#11131#来自CCSDirectTransaction::OperateEnding at index 0 of 1 operations,disposition 0[gle=0xd000038a]2014-10-30 14:31:33,错误CSI 0000000 F(F)80090352[Error,Facility=(0009),Code=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-installing-dll-int-winsxs
我认为托管DLL没有任何问题,因为我可以使用gautil手动将其安装到GAC中。
这让我发疯了。
好吧,经过大量的尝试和错误,我最终发现了问题。
我的MSI实际上是4个合并模块-需要安装在WinSxS中的非托管C++DLL、相应的VS2005运行时间(不要问)和需要安装在GAC中的托管C++包装器。
其中一个合并模块(托管C++包装器)与主MSI同名,所以当报告错误消息时,我(天真地)认为这是错误的模块。当然,错误消息有点不分青红皂白——实际上是非托管C++DLL(使用不同的名称)失败了。
失败的原因非常微不足道——DLL清单中引用的公钥令牌是错误的。我错误地将用于托管C++DLL的强名称密钥的公钥令牌放在那里,而不是代码签名证书的公钥令牌。
遗憾的是,这是一个男生的错误,尽管,我几乎不是一个男生。
令人讨厌的是,很明显,安装工具可以以更明智的方式报告错误。
所以,如果你读了这篇文章,它为你节省了很多时间,我很高兴。唉,我失去了我生命中再也回不来的日子。
WinSxS,GAC,程序集,清单,yada,yada。对我来说,这一切似乎太复杂和脆弱了。某个人,某个地方正在开怀大笑。
我只遇到过第三方合并模块的问题,尤其是您提到的那些模块。通常情况下,最好重构并创建setup.exe引导程序/链接器,以处理作为离散先决条件的安装。这样,当你的MSI安装时,它们就已经在那里了,而且无论如何都没有连接到你的MSI。