В установщике Windows все дело в руководствах по компонентам. Если бы у вас была установка из 10 файлов, все они имели бы уникальные идентификаторы компонентов. Если вы делаете серьезное обновление продукта, которому больше не нужны пять из этих файлов и который заменяет пять других, то, очевидно, вы не добавляете старые файлы в обновление, но также добавляете эти пять новых файлов с пятью новыми идентификаторами компонентов. Другими словами, симптомы предполагают, что вы добавили новые файлы, но сохранили существующие справочники компонентов. Крупное обновление включает в себя удаление старого продукта, но использование тех же идентификаторов компонентов приводит к тому, что счетчик ссылок для идентификатора никогда не становится равным нулю, что приводит к удалению этих компонентов (и, следовательно, файлов).
Кроме того, если компонент когда-либо был помечен как постоянный или файлы когда-либо были помечены как общие, файлы не будут удалены. Пометка компонента как постоянного прикрепляет его к системе, поэтому пересборка MSI и пометка его как непостоянного не исправит его. Компонент имеет дополнительную запись. Когда файл явно помечен как общий, это означает, что он может быть установлен с помощью установки, отличной от MSI (и не будет учитываться ссылка на guid компонента), поэтому в реестре будет запись в SharedDlls, потому что MSI было сказано, что есть другой не-MSI-клиент. SharedDll можно посмотреть в реестре, чтобы узнать, произошло ли это. Счетчик ссылок компонента обнаружить труднее, но подробный журнал обновления может помочь. Этот сценарий VB покажет все установленные компоненты и продукты, которые их используют:
Option Explicit
Public installer, fullmsg, comp, a, prod, fso, pname, ploc, pid, psorce
Установите fso = CreateObject("Scripting.FileSystemObject") Установите a = fso.CreateTextFile("comps.txt", True)
' Подключиться к объекту установщика Windows Set installer = CreateObject("WindowsInstaller.Installer") a.writeline ("MSI Components") при ошибке возобновить следующий For Each comp In installer.components a.writeline (comp & "используется продуктом: ") для каждого продукта в Installer.ComponentClients (comp) pid = installer.componentpath (prod, comp) pname = installer.productinfo (prod, "InstalledProductName") a.Writeline (" " & pname & " " & prod & "и устанавливается в "& pid) Далее Далее
enter code here
person
PhilDW
schedule
23.06.2016