如何手动清除格式错误的 wix-burn 包?
how to manually purge an malformed wix-burn package?
我正在学习如何为 wix-burn 开发自定义托管引导程序。据我所知,没有官方教程,非官方教程总是充满了我不感兴趣的 WPF 内容,而且论坛上的大多数人所做的只是说你必须创建一个继承自的 class BootstrapperApplication 并覆盖 运行() 方法。
我做到了,创建了配置文件,将有效负载添加到 xml 标记中。结果安装程序什么也没做,实际上它永远 运行,只是杀死它停止了它。我真诚地希望调用 base.Run() 会给我一些基本的默认无 GUI 行为。但这只是一个抽象方法。最终我了解到我必须调用一些 Engine.functions() 来实际做一些工作。所以我写了这个来测试:
protected override void Run()
{
Engine.Detect();
Engine.Plan(LaunchAction.Install);
Engine.Apply(IntPtr.Zero);
Engine.Quit(0);
}
我成功编译了一个包,实际安装了,问题是无法卸载。我的问题是,我该怎么做才能将它从我的系统中清除?我必须擦除哪些注册表项,我必须删除哪些缓存包,以及我还必须做什么才能摆脱它?
呸,你自己进地狱了。 :) 我会尽力帮助你。
你是怎么安装那个包的?
您感兴趣的 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>
Note: your registry search and conditions are a little different from
what is used in the WiX toolset to detect NETFX. The following is the
detection for NETFX the WiX toolset uses:
<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 项目中。 (我把它放在一个名为 "Resource" 的文件夹中。)
添加以下片段:
<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>
首先,注册表项将位于下面列出的两个位置之一——它可能是第一个,因为第二个是用于安装在 64 位 OS 上的 32 位应用程序。 =16=]
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
其次,您可以使用注册表项来确定缓存可执行文件以供卸载的位置,它可能位于看起来像 C:\ProgramData\Package Cache
.
的文件夹中
如果这是 .msi 安装,则还有另一个注册表项,文件缓存在提到的不同位置 here。
其他链接:
我正在学习如何为 wix-burn 开发自定义托管引导程序。据我所知,没有官方教程,非官方教程总是充满了我不感兴趣的 WPF 内容,而且论坛上的大多数人所做的只是说你必须创建一个继承自的 class BootstrapperApplication 并覆盖 运行() 方法。
我做到了,创建了配置文件,将有效负载添加到 xml 标记中。结果安装程序什么也没做,实际上它永远 运行,只是杀死它停止了它。我真诚地希望调用 base.Run() 会给我一些基本的默认无 GUI 行为。但这只是一个抽象方法。最终我了解到我必须调用一些 Engine.functions() 来实际做一些工作。所以我写了这个来测试:
protected override void Run()
{
Engine.Detect();
Engine.Plan(LaunchAction.Install);
Engine.Apply(IntPtr.Zero);
Engine.Quit(0);
}
我成功编译了一个包,实际安装了,问题是无法卸载。我的问题是,我该怎么做才能将它从我的系统中清除?我必须擦除哪些注册表项,我必须删除哪些缓存包,以及我还必须做什么才能摆脱它?
呸,你自己进地狱了。 :) 我会尽力帮助你。
你是怎么安装那个包的?
您感兴趣的 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>
Note: your registry search and conditions are a little different from what is used in the WiX toolset to detect NETFX. The following is the detection for NETFX the WiX toolset uses:
<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 项目中。 (我把它放在一个名为 "Resource" 的文件夹中。)
添加以下片段:
<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>
首先,注册表项将位于下面列出的两个位置之一——它可能是第一个,因为第二个是用于安装在 64 位 OS 上的 32 位应用程序。 =16=]
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
其次,您可以使用注册表项来确定缓存可执行文件以供卸载的位置,它可能位于看起来像 C:\ProgramData\Package Cache
.
如果这是 .msi 安装,则还有另一个注册表项,文件缓存在提到的不同位置 here。
其他链接: