Удаление используемой общей сборки оставляет WinSxs в плохом состоянии

У меня возникают проблемы с удалением общей сборки win32 SxS с помощью Wix3 на WinXP. Мой файл wix очень похож на описанный в http://n2.nabble.com/Tutorial-How-to-install-files-into-WinSxS-td841475.html.

Проблема в том, что если модуль из сборки используется, деинсталлятор завершается с кодом ошибки успеха, но оставляет сборку в сломанном состоянии: манифест и каталог безопасности были удалены, но каталог сборки все еще существует с моими dll в нем. . Библиотеки DLL сохраняются после перезагрузки, поэтому они никоим образом не помечаются для удаления. В файле журнала MSI нет явных ошибок.

Если я пытаюсь переустановить пакет, он пропускает установку сборки. Компоненты больше не зарегистрированы, поэтому я не могу заставить установщика повторить попытку удаления. В журнале msi при последующих установках отображается следующее:

MSI (c) (98:44) [11:46:56:263]: пропустить установку компонента сборки: {26A273E7-7F9A-4F77-9FA8-5E413A155BEC}, поскольку сборка уже существует

Я не могу найти способ вернуть SxS в нормальное состояние, кроме как вручную удалить каталог моей сборки, который на данный момент больше не защищен средством восстановления системы XP.

Хотя мой реальный установщик намного сложнее, я смог воспроизвести это с помощью очень простого установщика, который имеет одну функцию, содержащую один компонент. Этот компонент содержит dll, манифест и каталог безопасности. Для элемента dlls ‹File› установлены атрибуты KeyPath, Assembly и AssemblyManifest. После установки я могу имитировать процесс загрузки сборки, открыв DLL в MSVS.

Есть ли дополнительное действие, которое я должен вызвать при удалении, чтобы обнаружить и предотвратить эту ситуацию? В качестве альтернативы, есть ли способ принудительно выполнить операцию установки, даже если библиотеки DLL уже существуют в WinSXS?

Несколько связанно, у меня тоже проблема, если я пытаюсь обновить пакет, который установил сборку, если сборка не меняется. Установщик решает, что ему не нужно переустанавливать сборку (так как она не менялась), но потом при запуске SxsUninstallCA идет и удаляет сборку. С точки зрения установщика компонент все еще установлен, но файлы исчезли.


person Martin    schedule 15.09.2009    source источник


Ответы (1)


Я работаю над чем-то, что, я думаю, столкнется с той же проблемой.

На данный момент я предполагаю, что мне придется решить эту проблему с помощью небольшого колдовства от HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations regkey и, возможно, небольшого количества прав доступа к файлам (если файлы все еще были заблокированы).

Что, разумеется, требует перезагрузки.

Конечно, в вашем установщике вы можете проверить наличие ключей и заблокировать установку, пока они не исчезнут. (т.е. "нужно перезагрузиться").

person Garrett Serack    schedule 29.09.2009
comment
Проблема в том, что нет надежного способа узнать, куда Fusion собирается поместить сборку, поэтому вы на самом деле не знаете, какие файлы удалять (например, имя sxs меняется между XP и Vista). Вы действительно не должны удалять файлы из WinSxS. На этом пути лежит безумие. Я использую ключи реестра в качестве обходного пути, но это все равно не меняет того факта, что какой-то злонамеренный пользователь без прав администратора может удерживать дескриптор одного из файлов из сборки. Когда приходит ваш деинсталлятор, вы выплевываете свой каталог Sxs. - person Martin; 30.09.2009
comment
Я почти уверен, что окончательное размещение файла является детерминированным, хотя вы правы, оно отличается между XP и Vista+. Я знаю, что вы не должны удалять файлы из WinSXS, но когда файл должен был быть удален, но не был удален, я говорю, что все ставки сняты. Роб Меншинг (Wix Guy) и я подробно обсудили эту и пару других проблем, и он ждет моего решения. :D Мне осталось решить эту проблему примерно через 2 или 3 месяца, но я могу поговорить с сопровождающими Fusion и посмотреть, что они скажут. - person Garrett Serack; 01.10.2009