WiX定制引导程序应用与.NET 4.5

6

我很难让一个针对.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>

And the following.

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

And the following.

<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上的另一个问题中已经提到,预设引导程序应用程序安装.NET 4.5失败。该问题的一个答案建议将BootstrapperCore.config文件中supportedRuntime元素的sku值设置为答案。然而,我已经这样做了。还有其他的问题。


我对发生的事情有一些线索。我遵循了WiX中WixBA和TestBA应用程序的示例,即将BootstrapperCore.config文件命名为${ProjectName}.BootstrapperCore.config的模式。但我没有意识到,当通过Payload元素将此文件包含在捆绑包中时,您需要使用Name属性将其重命名为BootstrapperCore.config。 - Benilda Key
现在我又遇到了一个错误:"0x80131040:所定位的程序集清单定义与程序集引用不匹配。" - Benilda Key
我通过将与我的自定义BA相关联的Payload元素的SuppressSignatureVerification属性设置为“是”来解决了“0x80131040:所定位的程序集清单定义与程序集引用不匹配”的错误。我认为这只有在我使用测试(自签名)证书而不是受信任的证书时才是必要的。 - Benilda Key
1个回答

7
我希望通过发布自己问题的答案来帮助遇到类似问题的其他人。这个问题的解决不在于我的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应用程序的示例,将BootstrapperCore.config文件命名为${ProjectName}.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属性。这意味着将文件命名为BootstrapperCore.config并放置在.ba目录中。
接着,我遇到了以下错误:"0x80131040:所定位的程序集清单定义与程序集引用不匹配"。日志文件记录为无法加载托管的引导程序应用程序。
为了解决此问题,我只需将SuppressSignatureVerification属性设置为Payload元素关联的Custom BA的Yes。例如,我正在使用的Payload元素如下所示。
<Payload SourceFile="$(var.FSCustomBA.TargetDir)FSCustomBA.dll" SuppressSignatureVerification="yes" />

我认为这只是由于我使用的代码签名证书所必需的。
我的雇主为所有官方构建使用来自VeriSign的官方代码签名证书。然而,即使是大多数开发人员也不知道此证书的详细信息。相反,开发人员在日常工作中使用自签名证书。这对大多数事情都有效,但显然对此无效。
现在,我已经解决了这些问题,我的自定义引导程序应用程序正在加载,并且除了一个小错误之外,一切都按预期工作。
我希望通过记录我的发现,能够节省其他人解决此问题所必须经历的头疼。

如果在有效载荷中忘记包含配置文件,将会出现相同的问题。谢谢! - Ed Bayiates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接