как вручную очистить неправильно сформированный пакет wix-burn?

Я изучаю, как разработать собственный управляемый загрузчик для wix-burn. Насколько мне известно, официальных руководств не существует, неофициальные руководства всегда заполнены вещами WPF, которые меня не интересуют, и большинство людей на форумах не делают ничего, кроме того, что говорят, что вы должны создать класс, который наследуется от BootstrapperApplication и переопределяет класс. Метод Выполнить().

Я сделал это, создал файл конфигурации, добавил полезные данные в разметку xml. Полученный установщик ничего не сделал, на самом деле он работал вечно, только его уничтожение остановило его. Я искренне ожидал, что вызов base.Run() даст мне базовое поведение по умолчанию без графического интерфейса. Но это только абстрактный метод. В конце концов я узнал, что должен вызвать некоторый Engine.functions(), чтобы действительно выполнить какую-то работу. Итак, я написал это для проверки:

protected override void Run()
{
    Engine.Detect();
    Engine.Plan(LaunchAction.Install);
    Engine.Apply(IntPtr.Zero);
    Engine.Quit(0);
}

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


person Alex    schedule 30.09.2015    source источник


Ответы (2)


Во-первых, раздел реестра будет находиться в одном из двух мест, перечисленных ниже, и, вероятно, это первое место, поскольку второе предназначено для 32-разрядных приложений, установленных в 64-разрядной ОС.

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninst‌​all

Во-вторых, вы можете использовать ключ реестра, чтобы определить, где исполняемый файл кэшируется для удаления, что, вероятно, находится в папке, которая выглядит как C:\ProgramData\Package Cache.

Если бы это была установка .msi, то был бы другой раздел реестра, и файл кэшировался бы в другом месте, как указано здесь.

Другие ссылки:

person jjj    schedule 11.03.2016

Уффф, ты попал в ад. :) Я помогу вам, чем смогу.

Как вы установили этот пакет?

dll, которые могут вас заинтересовать:

  • BootstrapperCore.dll (входит в состав WiX SDK)
  • Microsoft.Deployment.WindowsInstaller.dll (входит в состав WiX SDK)
  • WindowsBase.dll (для многопоточности)

И один из файлов XML должен быть таким, чтобы вы могли видеть, что именно там находится.

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
  <Bundle Name="My Test Application" Version="1.0.0.0" Manufacturer="Bryan" UpgradeCode="PUT-GUID-HERE">
    <BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost">
      <Payload SourceFile="..\TestBA\BootstrapperCore.config"/>
      <Payload SourceFile="..\TestBA\bin\Release\TestBA.dll"/>
      <Payload SourceFile="..\TestBA\bin\Release\GalaSoft.MvvmLight.WPF4.dll"/>
      <Payload SourceFile="C:\Program Files\WiX Toolset v3.6\SDK\Microsoft.Deployment.WindowsInstaller.dll"/>
    </BootstrapperApplicationRef>
    <Chain>
      <PackageGroupRef Id='Netfx4Full' />
      <MsiPackage SourceFile="..\DummyInstaller\bin\Release\DummyInstaller.msi" Id="DummyInstallationPackageId" Cache="yes" Visible="no"/>
    </Chain>
  </Bundle>
  <Fragment>
    <!-- Managed bootstrapper requires .NET as a dependency, since it was written in .NET.
       WiX provides a Bootstrapper for the bootstrapper. The fragment below includes .NET.
       For more information or examples see Heath Stewart's blog or the WiX source:
       http://blogs.msdn.com/b/heaths/archive/2011/10/28/introducing-managed-bootstrapper-applications.aspx
       -->
    <WixVariable Id="WixMbaPrereqPackageId" Value="Netfx4Full" />
    <WixVariable Id="WixMbaPrereqLicenseUrl" Value="NetfxLicense.rtf" />
    <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version" Variable="Netfx4FullVersion" />
    <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version" Variable="Netfx4x64FullVersion" Win64="yes" />
    <PackageGroup Id="Netfx4Full">
      <ExePackage Id="Netfx4Full" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes"
                  SourceFile="C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
                  DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"
                  DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)" />
    </PackageGroup>
  </Fragment>
</Wix>

Примечание. Ваш поиск и условия в реестре немного отличаются от того, что используется в наборе инструментов WiX для обнаружения NETFX. Ниже показано обнаружение NETFX, которое использует набор инструментов WiX:

<util:RegistrySearch
    Id="NETFRAMEWORK40"
    Variable="NETFRAMEWORK40"
    Root="HKLM"
    Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
    Value="Install"
    Result="value" />

Следующее решение может быть таким:

Включите элемент PackageGroupRef в вашу цепочку:

<Bundle>
    <Chain>
        <PackageGroupRef Id="NetFx452" />        
        <MsiPackage ... />
    </Chain>
</Bundle>

Загрузите Microsoft .NET Framework 4.5.2 (автономный установщик) и добавьте его в свой проект Bootstrapper. (Я положил его в папку под названием «Ресурс».)

Добавьте следующий фрагмент:

<Fragment>
    <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
    <PackageGroup Id="NetFx452">
        <ExePackage Id="NetFx452"
                    Cache="no"
                    Compressed="yes"
                    PerMachine="yes"
                    Permanent="yes"
                    Vital="yes"
                    Name="NDP452-KB2901907-x86-x64-AllOS-ENU.exe"
                    SourceFile="Resource\NDP452-KB2901907-x86-x64-AllOS-ENU.exe"
                    DetectCondition="NETFRAMEWORK45"
                    InstallCommand="/q /norestart"  />     
    </PackageGroup>
</Fragment>
person Josip Ivic    schedule 15.10.2015
comment
Я ценю вашу помощь, но на самом деле это не ответ на мой вопрос - person Alex; 15.10.2015
comment
У меня была аналогичная проблема, поэтому я попытался представить свое решение. извините, что это не помогло. - person Josip Ivic; 16.10.2015