«Нам часто в жизни не хватает друзей и доброты…»

Лешка пишет… о музыке, компьютерах, поездках и о себе.

Previous Entry Share Next Entry
Проблема с установкой merge-модуля VC2005 x64
питер, Леша
alexyv

Read it in English

В очередной раз пришлось разбираться с ошибками установки библиотек Visual C++ 2005 x64. (В прошлый раз пришлось бороться с тем, что компоненты приложения ссылались на разные версии C++ runtime. Именно тогда в инсталляторе стали использоваться merge-модули.)

В этот раз на системах Windows 7 и Windows Server 2008 R2. Во время установки возникает следующая ошибка:
Ошибка при установке Visual C++ 2005 x64 runtime из merge-модуля

Текст сообщения:

An error occured during the installation of assembly component {844EFBA7-1C24-9382-A01F-C8B3B9A1E18E}.
HRESULT: 0x80073715.

В подробном логе, полученном с помощью (msiexec /i prod.msi /l*v msi.log), нашлись следующие записи:

MSI (s) (E0:E0) [15:43:58:875]: Assembly Error:The identities of the manifests are identical but their contents are different.
MSI (s) (E0:E0) [15:43:58:875]: Note: 1: 1935 2:
{844EFBA7-1C24-93B2-A01F-C8B3B9A1E18E} 3: 0x80073715 4: IAssemblyCacheItem 5:
Commit 6:
Microsoft.VC80.CRT,type="win32",version="8.0.50727.4053",publicKeyToken="1fc8b3b9a1e18e3b",processorArchitecture="amd64"
MSI (s) (E0:E0) [15:43:58:875]: Assembly Error (sxs): Please look into
Component Based Servicing Log located at -121510792ndir\logs\cbs\cbs.log to get
more diagnostic information.
Error 1935. An error occured during the installation of assembly component
{844EFBA7-1C24-93B2-A01F-C8B3B9A1E18E}. HRESULT: 0x80073715. assembly
interface: IAssemblyCacheItem, function: Commit, assembly name:
Microsoft.VC80.CRT,type="win32",version="8.0.50727.4053",publicKeyToken="1fc8b3b9a1e18e3b",processorArchitecture="amd64"

Лог файл %winndir%\logs\cbs\cbs.log не предоставил много больше информации, хотя в нем содержался мнемонический код ошибки: STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT. Этот код ошибки означает, что в системе уже есть сборка с таким же identity, что и устанавливаемая, и их версии тоже совпадают, но при этом устанавливаемые файлы отличаются.

На доступных мне машинах я не смог воспроизвести проблему: успешно устанавливается и работает. В процессе исследований выяснилось, что на проблемных машинка уже установлена сборка (assembly) Microsoft Visual C++ 2005 x64 Runtime.

Установил у себя из vcredist_x64.exe. После этого установка продукта стала завершаться с ошибкой.

Провел я и обратный эксперимент: на чистую машинку сначала установил наш продукт, а затем VC++ 2005 runtime. В результате установка vcredist_x64.exe завершилась с такой же ошибкой:
Ошибка при установке Visual C++ 2005 x64 runtime из vcredist_x64.exe

Текст сообщения:

Product: Microsoft Visual C++ 2005 Redistributable (x64) -- Error 1935.An error occurred during the installation of assembly 'Microsoft.VC80.CRT,type="win32",version="8.0.50727.4053",publicKeyToken="1fc8b3b9a1e18e3b",processorArchitecture="amd64"'. Please refer to Help and Support for more information. HRESULT: 0x80073715. assembly interface: IAssemblyCacheItem, function: Commit, component: {844EFBA7-1C24-93B2-A01F-C8B3B9A1E18E}

Решил сравнить содержимое папок C:\Windows\winsxs\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053 после установки из merge-модуля и после vcredist_x64.exe. Сборка содержит три файла: msvcm80.dll, msvcp80.dll, msvcr80.dll. Версии и размеры этих файлов совпадают в обоих вариантах установки. Но все равно два файла из набора отличаются друг от друга. Я выяснил, что отличаются они временем цифровой подписи: В merge-модулях библиотеки подписаны 12 июля 2009 г. в 11 часов, а в vcredist_x64.exe 12 июля 2009 г. в 6 часов:

Цифровая подпись msvcr80.dll из merge-модуля Цифровая подпись msvcr80.dll из vcredist_x64.exe

На системах с Windows XP и Windows Server 2003 подобная разница не приводила к ошибке. А на более новых Windows 7 и Windows Server 2008 R2 приводит к ошибке.

В Microsoft Connect эта проблема описана: 8.0.50727.4053 x64 CRT merge modules fails to install on x64 but ok on x86. Это же сообщение можно найти на форуме MSDN. Вопрос помечен как решенный, но ответ какой-то бессодержательный и невразумительный. В сообщении есть ссылка на другое описание такой же проблемы в Microsoft Connect.

И у меня тоже никакого решения для преодоления данной трудности.
Ясно одно, что Visual C++ 2005 x64 runtime нельзя установить одновременно и из merge-модулей, и из vcredist_x64.exe, чего быть не должно.

С 32 битной (x86) версией таких проблем нет: всё прекрасно работает.


?

Log in

No account? Create an account