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

StackOverflow https://stackoverflow.com/questions/1425411

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top