我无法获得面向.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值。但是,我做到了这一点。还有其他事情正在发生。
答案 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的官方代码签名证书进行所有官方构建。但是,即使大多数开发人员都对此证书的详细信息保密。开发人员使用自签名证书进行日常工作。这适用于大多数事情,但显然不适用于此。
现在我已经解决了这些问题,我的自定义引导程序应用程序正在加载,除了一个小错误之外,它按预期工作。
我希望通过记录我的发现,我将为其他人解决我必须解决的问题。