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

时间:2016-06-25 00:11:04

标签: .net wix burn wix3.10

我无法获得面向.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值。但是,我做到了这一点。还有其他事情正在发生。

1 个答案:

答案 0 :(得分:3)

我正在回答我自己的问题,希望这会让遇到类似问题的人受益。

事实证明,问题不在于我的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:找到的程序集的清单定义与程序集引用不匹配。”在日志文件中,这被记录为无法加载Managed Bootstrapper Application。

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

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

我认为这只是必要的,因为我正在使用代码签名证书。

我的雇主使用VeriSign的官方代码签名证书进行所有官方构建。但是,即使大多数开发人员都对此证书的详细信息保密。开发人员使用自签名证书进行日常工作。这适用于大多数事情,但显然不适用于此。

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

我希望通过记录我的发现,我将为其他人解决我必须解决的问题。