如何手动清除畸形的wix-burn包?

时间:2015-09-30 21:46:30

标签: wix customization burn

我正在学习如何为wix-burn开发自定义托管引导程序。据我所知,没有正式的教程,非官方教程总是充满了我不感兴趣的WPF内容,论坛上的大多数人所做的不仅仅是说你必须创建一个继承自BootstrapperApplication和覆盖Run()方法。

我这样做了,创建了配置文件,将有效负载添加到xml标记中。由此产生的安装程序什么也没做,实际上它永远运行,只有杀死它才能阻止它我真诚地期望调用base.Run()会给我一些基本的默认的无GUI行为。但这只是一种抽象的方法。最后我了解到我必须调用一些Engine.functions()来实际做一些工作。所以我写了这个测试:

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

我成功编译了一个实际安装的软件包,问题是它无法卸载。我的问题是,我该怎样做才能从我的系统中清除它?我必须删除哪些注册表项,必须删除哪些缓存包,以及我还必须做些什么来摆脱它?

2 个答案:

答案 0 :(得分:1)

首先,注册表项将位于下面列出的两个位置之一 - 它可能是第一个,因为第二个是安装在64位操作系统上的32位应用程序。

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

其次,您可以使用注册表项来确定缓存可执行文件的缓存位置,该文​​件可能位于C:\ProgramData\Package Cache的文件夹中。

如果这是.msi安装,那么还有另一个注册表项,文件将缓存在提及here的其他位置。

其他链接:

答案 1 :(得分:0)

Ufff,你让自己陷入了地狱。 :)我会尽我所能帮助你。

你是如何安装该软件包的?

你可以找到有趣的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项目中。 (我把它放在名为&#34;资源&#34;的文件夹中。)

添加以下片段:

<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>