Wix Bootstrapper自定义UI关联报错求助及教程推荐
首先,咱们来拆解你遇到的错误:Either 'Microsoft.Tools.WindowsInstallerXml.AssemblyDefaultWixExtensionAttribute' was not defined or the type defined in extension '..\Setup\bin\Debug\PETSetup.dll' could not be loaded.
这个错误的核心原因是你错误地使用了Wix扩展专用的Attribute,自定义Bootstrapper Application(BA)完全不需要这个属性,反而会导致Wix尝试把你的BA当成扩展加载,从而失败。下面是一步步的解决方法,以及完整的自定义BA配置教程:
一、立即修复现有错误
1. 移除错误的Attribute实例化
打开你的自定义UI主CS文件,删掉这一行完全多余的代码:
Microsoft.Tools.WindowsInstallerXml.AssemblyDefaultWixExtensionAttribute t = new Microsoft.Tools.WindowsInstallerXml.AssemblyDefaultWixExtensionAttribute(typeof(PETSetup));
这个Attribute是用来标记Wix扩展插件的,和自定义BA没有任何关系,保留它只会让Wix加载逻辑混乱。
2. 修正BootstrapperCore.config配置
确保你的BootstrapperCore.config文件(Bundle中作为Payload引用的那个)正确指定了自定义BA的类型,格式为命名空间.类名, 程序集名称。示例配置如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" /> </startup> <appSettings> <!-- 替换成你的BA类的完全限定名和程序集名称 --> <add key="BootstrapperAssembly" value="PETSetup.PETSetup, PETSetup" /> </appSettings> </configuration>
同时要确保这个文件的复制到输出目录属性设置为始终复制,保证编译后能被Bundle找到。
3. 优化Bundle中的Payload配置
你当前的Bundle里引用了C:\Program Files (x86)\WiX Toolset v3.11\SDK\Microsoft.Deployment.WindowsInstaller.dll,建议改为引用自定义BA项目输出目录中的该文件(因为你已经把引用的复制本地设为True了),避免路径硬编码带来的问题:
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost"> <Payload SourceFile="X:\SS\Wix Installer\Setup\bin\Debug\BootstrapperCore.config"/> <Payload SourceFile="X:\SS\Wix Installer\Setup\bin\Debug\PETSetup.dll"/> <Payload SourceFile="X:\SS\Wix Installer\Setup\bin\Debug\Microsoft.Deployment.WindowsInstaller.dll"/> </BootstrapperApplicationRef>
二、完整自定义Wix Bootstrapper UI分步教程
如果你需要从0到1搭建自定义BA,以下是完整步骤:
1. 创建自定义BA项目
- 在Visual Studio中新建一个**Class Library (.NET Framework)**项目(目标框架选.NET Framework 4.0及以上,和你Bundle要求的.NET版本一致)。
- 引用Wix SDK中的核心DLL:
Microsoft.Tools.WindowsInstallerXml.Bootstrapper.dll(路径:C:\Program Files (x86)\WiX Toolset v3.11\SDK)- 若需要操作MSI数据库,额外引用
Microsoft.Deployment.WindowsInstaller.dll
- 将这两个引用的复制本地属性设为
True,确保编译后输出到项目目录。
2. 添加BootstrapperCore.config
- 在项目中添加XML文件,命名为
BootstrapperCore.config,设置复制到输出目录为始终复制,内容参照上面的示例。
3. 编写自定义BA逻辑
创建继承自BootstrapperApplication的类,实现Run方法初始化你的WPF/WinForms UI(以你现有的WPF代码为例,修正后如下):
using Microsoft.Tools.WindowsInstallerXml.Bootstrapper; using PETSetup.Models; using PETSetup.ViewModels; using PETSetup.Views; using System.Windows.Threading; namespace PETSetup { public class PETSetup : BootstrapperApplication { public static Dispatcher Dispatcher { get; set; } protected override void Run() { Dispatcher = Dispatcher.CurrentDispatcher; var model = new BootstrapperApplicationModel(this); var viewModel = new InstallViewModel(model, Engine); var view = new InstallView(viewModel); model.SetWindowHandle(view); Engine.Detect(); view.Show(); Dispatcher.Run(); Engine.Quit(model.FinalResult); } } }
4. 关联Bundle与自定义BA
- 在Wix Bundle项目中,确保已添加
BalExtension的引用(右键项目→添加引用→Wix扩展→勾选BalExtension)。 - 使用
BootstrapperApplicationRef指向ManagedBootstrapperApplicationHost,并添加必要的Payload(就是你自定义BA输出的文件)。
5. 编译测试
- 先编译自定义BA项目,确认输出目录有
PETSetup.dll、BootstrapperCore.config以及相关依赖DLL。 - 再编译Bundle项目,若没有错误,运行生成的exe即可看到自定义UI。
内容的提问来源于stack exchange,提问作者Gavin

