Невозможно установить управляемую сборку DLL из установщика MSI - Ошибка 1935 HRESULT=0x800736FD

Я создаю управляемую DLL, которая входит в состав MSI вместе с соответствующим подписанным каталогом. При установке MSI не удается сообщить имя сборки, процессор архитектуры и т. Д. При запуске MSIEXEC с подробным ведением журнала отображается следующее:

MSI (64:DC) [14:31:33:754]: Ошибка сборки: HRESULT не может быть преобразован в соответствующий код ошибки Win32. MSI (64:DC) [14:31:33:785]: Примечание: 1: 1935 2: {1ADE2A83-E905-4F35-9DD8-61F512CA50E8} 3: 0x800736FD 4: IAssemblyCacheItem 5: Фиксация 6: BLAHBLAH,version="10.0.62601.0",type="win32",processorArchitecture="x86",publicKeyToken="5f523ae7e6e1b389" MSI (64:DC) [14:31:33:785]: ошибка сборки (sxs): Пожалуйста, загляните в Журнал обслуживания на основе компонентов, расположенный по адресу -207342408ndir\logs\cbs\cbs.log, чтобы получить больше диагностической информации. MSI (64:DC) [14:31:33:785]: примечание: 1: 2205 2: 3: ошибка MSI (64:DC) [14:31:33:785]: примечание: 1: 2228 2: 3: ошибка 4: ВЫБРАТЬ Message ОТ Error ГДЕ 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", 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: ВЫБРАТЬ Message ОТ Error ГДЕ Error = 1709 MSI (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 0000000c Выполнение 1 операции; 1 не блокируются / разблокируются и следуют: Установить (5): флаги: 0 tlc: [BLAHBLAH, версия = 10.0.62601.0, pA = PROCESSOR_ARCHITECTURE_INTEL (0), нейтральный к культуре, нейтральный по версии VersionScope, PublicKeyToken = {l:8 b:5f523ae7e6e1b389}, Type = [l:10{5}]"win32", нейтральный TypeName, нейтральный PublicKey]) ref: ( flgs: 00000000 guid: {27dec61e-b43c-4ac8-88db-e209a8242d90} name: [l:0]"" ncdata: [l:62{31}]"C:\Windows\system32\msiexec.exe") отпечаток большого пальца: [l:128{64}]"c303b9f117203669bdfdbf904a7f1d45e4767da45615a08eff196fb02d093399" 2014-10-30 CS31:33, ошибка 0000000d@2014/10/30:14:31:33,488 (F) d:\win7sp1_gdr\base\wcp\library\catalog.cpp(263): ошибка c000038a [ошибка, средство =(система), код =906 (0x038a))] возникла из функции CCatalog::VerifyCertChainRoot выражение: HRESULT_FROM_WIN32((dwError)) [gle=0x80004005] 2014-10-30 14:31:33, ошибка CSI 0000000e (F) c000038a [ошибка,Facility=(система), код =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 что-то не так, поскольку я могу вручную установить ее в GAC с помощью gacutil.

Это сводит меня с ума.

2 ответа

Решение

Итак, после МНОГО проб и ошибок я в конце концов обнаружил проблему.

Мой MSI на самом деле представляет собой 4 модуля слияния - неуправляемую C++ DLL, которую необходимо установить в WinSxS, соответствующее время выполнения VS2005 (не спрашивайте) и управляемую оболочку C++, которую необходимо установить в GAC.

Один из модулей слияния (управляемая оболочка C++) имел то же имя, что и основной MSI, поэтому, когда сообщалось об ошибке, я думал (наивно), что это был ошибочный модуль. Конечно, сообщение об ошибке немного неразборчиво - на самом деле это была неуправляемая C++ DLL (с ​​другим именем), которая не работала.

Причина сбоя была чрезвычайно тривиальной - неверный токен открытого ключа, указанный в манифесте для DLL. Я по ошибке поместил в нее токен открытого ключа ключа строгого имени, используемого для DLL-библиотеки Managed C++, а не токен открытого ключа сертификата подписи кода.

К сожалению, это была ошибка Школьника, хотя я вряд ли Школьник.

Что раздражает, так это то, что ошибка - это нечто совершенно очевидное, о чем инструмент инсталлятора мог бы сообщить гораздо более разумно.

Так что, если вы прочитаете это, и это сэкономит вам много времени, я рад. Увы, я потерял дни своей жизни, которые я никогда не смогу вернуть.

WinSxS, GAC, сборки, манифесты, Яда, Яда, Яда. Все это кажется мне слишком сложным и хрупким. Кто-то где-то хорошо смеется.

У меня не было ничего, кроме проблем со сторонними модулями слияния, особенно теми, о которых вы говорите. Как правило, лучше всего выполнить рефакторинг и создать загрузчик / цепочку setup.exe для обработки их установки в качестве дискретных предварительных условий. Таким образом, они уже есть, когда ваш MSI установлен и не подключен к MSI в любом случае.

Другие вопросы по тегам