2014-11-04 4 views
2

сегодня я узнал, что мой установщик не удаляется правильно. Значение моего приложения больше не отображается на панели управления после удаления, но все файлы все еще присутствуют. Я просмотрел файлы журналов, и я вижу много «запретов на удаление компонента, поскольку существует другой клиент», который afaik означает, что я напортачил.Набор инструментов Wix: полная очистка после «запрета удаления компонента с другого клиента существует»

Итак, что является лучшим способом очистки моего компьютера и предотвращения его возникновения в будущем? Что могло быть причиной этого? afaik не совсем удаленная предыдущая версия моего приложения является причиной этой ошибки?

К сожалению, использование ВМ не представляется возможным по разным причинам ..

FYI: Для разработки и целей тестирования я обычно тест и создать инсталлятор с 1.0.xxxxx, где ХХХХХ часто остается неизменным. Мой обновленный код всегда один и тот же. Кроме того, я использую тепло и везде, где это возможно, я позволяю wix автоматически генерировать GUID. Кроме того, у меня есть один ЦС, чтобы показать мой файл readme после установки, а другой - выполнить пакетный файл (изменяет записи реестра с помощью powercfg). После удаления запускается исполняемый файл для импорта REG-файла для восстановления измененных записей реестра (поскольку они будут удалены с помощью wix).

+0

Нет, это не ошибка; Это информационный. Поскольку вы устанавливаете продукт после продукта, совместно использующего компонент, компонент не следует удалять, пока все продукты не будут удалены. Возможно, вы захотите просто удалить продукт перед установкой продукта, созданного следующей сборкой. –

ответ

4

Похоже, вам необходимо удалить функции (или целые продукты), которые установили ваши нежелательные компоненты. Установщик Windows имеет API для запроса компонентов, функций и продуктов. WiX Toolset включил оболочку вокруг API под названием DTF. Вы можете использовать его для запроса компонентов по компонентам.

Итак, выйди из своего любимого сценариста .NET-скрипта (шахта LINQPad) и запустите запрос. Например, чтобы узнать, как удалить "candle.exe":

// using System.Linq; 
// using Microsoft.Deployment.WindowsInstaller; 

// <ref>"C:\Program Files (x86)\WiX Toolset v3.8\SDK\ 
     Microsoft.Deployment.WindowsInstaller.dll"</ref> 

ComponentInstallation.AllComponents 
    .Where(c=>c.State == InstallState.Local) 
    .Where(c => c.Path.ToLowerInvariant().EndsWith(@"\candle.exe")) 
    .SelectMany(c => c.ClientProducts 
     .SelectMany(p => p.Features.Where(f => f.Usage.UseCount > 0) 
      .Select(f => new { 
       c.Path, 
       f.FeatureName, 
       p.LocalPackage, 
       p.UserSid, 
       p.ProductCode}))) 

LINQPad Instant Share

LINQPad Output

Затем запустите msiexec /x <ProductCode>, чтобы удалить все функции продуктов

или msiexec /i <LocalPackage> REMOVE=<FeatureName> чтобы удалить только те функции, которые устанавливали компонент.

5

Несмотря на то, что это немного старая ссылка, однако публиковать мои выводы, которые могут быть полезны другим, кто сталкивается с такой же ситуацией.

Если вы нашли "Disallowing uninstallation of component: {Some GUID} since another client exists" в своих файлах журналов, причина может заключаться в том, что ваши предыдущие установки могут по-прежнему ссылаться на этот компонент/GUID.

Кроме того, если вы рискуете, что попытаетесь удалить ключи реестра вручную, вы даже не сможете найти GUID в regedit.

Но немногие из этих реестров могут быть там, и они могут быть скрыты. В этом случае используйте инструмент RegSeeker http://www.hoverdesk.net/, который поможет найти скрытые реестры. Будьте осторожны и осторожны, когда будете заниматься реестрами.

Основываясь на GUID, получите имя компонента из вашего решения/проекта и найдите его с помощью опции «Найти в реестре» этого инструмента. Проверьте и удалите только те записи, которые, по вашему мнению, не нужны.

Правда, я узнал об этом инструменте, используя ссылку ниже

http://www.daviddeley.com/solutions/msiexec/index.htm

0

Недавно мы имели дело, что одна из наших машин развития не может удалить все компоненты при деинсталляции. Однако на других машинах установка WiX работала по назначению.

Таким образом, если вы неправильно удалили более раннюю версию своего продукта и получили сообщение Disallowing uninstallation of component: {GUID} since another client exists, существует высокая вероятность того, что у вас есть сиротские компоненты, лежащие в вашем реестре.

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

$productName = "Path\\YourProductName" # this should basically match against your previous 
# installation path. Make sure that you don't mess with other components used 
# by any other MSI package 

$components = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\ 
$count = 0 

foreach ($c in $components) 
{ 
    foreach($p in $c.Property) 
    { 
     $propValue = (Get-ItemProperty "Registry::$($c.Name)" -Name "$($p)")."$($p)" 
     if ($propValue -match $productName) 
     { 
      Write-Output $propValue 
      $count++ 
      Remove-Item "Registry::$($c.Name)" -Recurse 
     } 
    } 
} 

Write-Host "$($count) key(s) removed" 

Если вы хотите, чтобы получить более подробное объяснение о причине сообщения disallowing uninstallation... посмотрите here.