WiX 自定义引导程序应用程序和 .NET 4.5

WiX Custom Bootstrapper Application and .NET 4.5

我在获取以 .NET 4.5 为目标的 WiX 自定义引导程序应用程序时遇到困难。

我的 Bundle.wxs.

中有以下行
<PackageGroupRef Id="NetFx45Web" />

我的BootstrapperCore.config如下

<configuration>
    <configSections>
        <sectionGroup name="wix.bootstrapper" type="Microsoft.Tools.WindowsInstallerXml.Bootstrapper.BootstrapperSectionGroup, BootstrapperCore">
            <section name="host" type="Microsoft.Tools.WindowsInstallerXml.Bootstrapper.HostSection, BootstrapperCore" />
        </sectionGroup>
    </configSections>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <wix.bootstrapper>
        <host assemblyName="FSCustomBA" />
    </wix.bootstrapper>
</configuration>

我已经尝试了多种变体。

比如下面的我也试过

<host assemblyName="FSCustomBA">
    <supportedFramework version="v4\Full" />
    <supportedFramework version="v4\Client" />
</host>

以及以下。

<host assemblyName="FSCustomBA">
    <supportedFramework version="v4.5\Full" />
    <supportedFramework version="v4.5\Client" />
</host>

以及以下。

<host assemblyName="FSCustomBA">
    <supportedFramework version="v4.5" />
</host>

以及以下。

<host assemblyName="FSCustomBA">
    <supportedFramework version="v4.5\Full" />
</host>

以及以下。

<host assemblyName="FSCustomBA">
    <supportedFramework version="v4.5\Client" />
</host>

无论我如何尝试,当我在未安装 .NET 4.5 的系统上 运行 我的安装程序包时,系统会提示我安装 .NET 4.5。一旦我按下同意并安装按钮,安装包就会崩溃。当我再次尝试 运行 安装程序包时,它在显示按钮之前挂起。即使在我重新启动后它也会挂起。我需要从系统映像恢复我的系统,然后它会再次 运行。

谁能告诉我我做错了什么?

我正在使用 WiX 3.10。

到目前为止,我唯一知道发生了什么的线索是生成的日志文件中的以下行。

[1A14:1778][2016-06-28T10:01:17]i000: The prerequisites were already installed. The bootstrapper application will not be reloaded to prevent an infinite loop.

Stack Overflow 上的另一个问题中提到了这一点,Prerequisite bootstrapper application fails to install .NET 4.5。这个问题的答案之一表明答案是在 BootstrapperCore.config 文件的 supportedRuntime 元素中设置 sku 值。但是,我已经这样做了。其他事情正在发生。

我发布了我自己问题的答案,希望它能对遇到类似问题的其他人有所帮助。

事实证明,问题不在我的 BootstrapperCore.config 文件的内容中,而是在我的 BootstrapperCore.config 文件的名称中。也就是说,我的 BootstrapperCore.config 文件的最终内容与我在问题中指出的完全相同,如下所示。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="wix.bootstrapper" type="Microsoft.Tools.WindowsInstallerXml.Bootstrapper.BootstrapperSectionGroup, BootstrapperCore">
            <section name="host" type="Microsoft.Tools.WindowsInstallerXml.Bootstrapper.HostSection, BootstrapperCore" />
        </sectionGroup>
    </configSections>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <wix.bootstrapper>
        <host assemblyName="FSCustomBA" />
    </wix.bootstrapper>
</configuration>

当我尝试涉及使用 supportedFramework 元素的多种变体时,我走错了路。结果证明问题与此无关。相反,问题是我遵循了作为 WiX 一部分的 WixBA 和 TestBA 应用程序的示例,即在模式 ${ProjectName}.BootstrapperCore.config 之后命名 BootstrapperCore.config 文件。因为我的项目名为 FSCustomBA,所以我的 BootstrapperCore.config 文件被命名为 FSCustomBA.BootstrapperCore.config.

这很好。它可以工作。但是,我没有意识到的是,在安装包为 运行 时创建的 .ba 目录的上下文中,该文件必须命名为 BootstrapperCore.config。由于我不知道这一点,我将文件包含在我的包中,如下所示。

<Payload SourceFile="$(var.FSCustomBA.TargetDir)FSCustomBA.BootstrapperCore.config" />

这行不通。以下将.

<Payload Name="BootstrapperCore.config"  SourceFile="$(var.FSCustomBA.TargetDir)FSCustomBA.BootstrapperCore.config" />

注意 Payload 元素中 Name 属性的使用。这表示在 .ba 目录中将文件命名为 BootstrapperCore.config。

解决该问题后,我又遇到了以下错误:“0x80131040:找到的程序集的清单定义与程序集引用不匹配。”在日志文件中,这被记录为无法加载托管引导程序应用程序。

为了解决这个问题,我只是将与我的自定义 BA 关联的 Payload 元素的 SuppressSignatureVerification 属性设置为 yes。例如我使用的Payload元素如下

<Payload SourceFile="$(var.FSCustomBA.TargetDir)FSCustomBA.dll" SuppressSignatureVerification="yes" />

我认为这只是由于我正在使用的代码签名证书所必需的。

我的雇主对所有正式版本使用 VeriSign 的官方代码签名证书。然而,该证书的详细信息甚至对大多数开发人员都是保密的。开发人员在日常工作中使用自签名证书。这适用于大多数情况,但显然不适用于此。

现在我已经解决了这些问题,我的自定义引导程序应用程序正在加载,除了一个小错误外,按预期工作。

我希望通过记录我的发现,我可以让其他人免去我为解决这个问题而不得不经历的头痛。