Деинсталляция используемой общей сборки, оставляющая WinSxs в плохом состоянии - PullRequest
1 голос
/ 15 сентября 2009

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

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

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

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

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

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

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

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

1 Ответ

2 голосов
/ 30 сентября 2009

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

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

Что, конечно, требует перезагрузки.

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

...