У меня есть установщик MSI, который регистрирует DLL. Я также хочу дать пользователям возможность вручную зарегистрировать одну и ту же DLL (может быть, другая версия). Рассмотрим случай, когда пользователь сначала устанавливает MSI, затем вручную регистрирует DLL (используя regsvr32). Предыдущий файл перезаписан. Когда я удаляю свой первоначальный MSI, перезаписываемая DLL также удаляется. Есть ли способ предотвратить это, если первая DLL была перезаписана.WIX удалить DLL из реестра, если он установлен
ответ
Вы можете использовать элемент FileSearch WiX, и если DLL с этой версией найдена, установите свойство соответствующим образом. Затем вы можете использовать это свойство, чтобы решить, должна ли DLL быть незарегистрирована или нет.
Я предполагаю, что для проверки, зарегистрирован ли пользователь вручную или нет, вам нужно сохранить эту информацию во время установки, например. где-то в Реестре. Затем вы можете сделать RegistrySearch для этого ключа.
Возможно, вам также необходимо установить атрибут Permanent
компонента, а затем удалить его самостоятельно (в зависимости от установленного выше свойства).
Вы можете отправить эту другую Dll в отдельный MSI, убедившись, что она установлена в том же месте и имеет тот же компонентный указатель. Это приведет к тому, что Windows узнает о том, что она будет использоваться совместно, и удаление одной MSI не приведет к удалению оставшейся Dll из-за этого совместного использования.
Не зная вашей точной ситуации, трудно понять, будет ли это работать. Если вы всегда отправляете более высокую версию, чем в текущей MSI, она будет работать. Если вы попытаетесь заменить эту Dll вручную более низкой версией файла, тогда восстановление вернет правильную версию с оригинальной MSI, так что у вас уже есть потенциальная проблема. Единственный безопасный способ поддерживать файлы, установленные с MSI, - это другое обновление типа MSI, такое как исправление, крупное обновление и т. Д.