为什么托管引导程序应用程序始终安装.Net框架,无论.net框架是否存在?

时间:2013-05-21 09:24:44

标签: wix bootstrapper

如果未添加WixVariables WixMbaPrereqPackageIdWixMbaPrereqLicenseUrl,则无法编译。

  

Windows Installer XML变量!(wix.WixMbaPrereqPackageId)未知   Windows Installer XML变量!(wix.WixMbaPrereqLicenseUrl)未知。

如果添加了两个变量,即使我的测试计算机安装了.NET Framework 4.0,引导程序也会每次都安装.NET Framework 4.0。

如果目标计算机已经具有.NET框架,如何避免安装.NET Framework?

以下是我的示例代码。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Bundle Name="TestBootstrapper" Version="1.0.0.0" Manufacturer="Microsoft" UpgradeCode="e8c02687-b5fe-4842-bcc4-286c2800b556">    
<BootstrapperApplicationRef Id='ManagedBootstrapperApplicationHost'>
      <Payload SourceFile='MyBA.dll' />
    </BootstrapperApplicationRef>

    <!--<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />-->

        <Chain>
      <PackageGroupRef
                Id="Netfx4Full"/>
      <MsiPackage Name="SetupProject1.msi" SourceFile="data\SetupProject1.msi" DownloadUrl="http://myserver/SetupProject1.msi" Compressed="no">
      </MsiPackage>
      <MsiPackage Name="SetupProject2.msi" SourceFile="data\SetupProject2.msi" DownloadUrl="http://myserver/SetupProject2.msi" Compressed="no">
      </MsiPackage>
        </Chain>
    </Bundle>

  <Fragment>
    <WixVariable
        Id="WixMbaPrereqPackageId"
        Value="Netfx4Full" />
    <WixVariable
        Id="WixMbaPrereqLicenseUrl"
        Value="NetfxLicense.rtf" />

    <util:RegistrySearch
        Root="HKLM"
        Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
        Value="Version"
        Variable="Netfx4FullVersion" />
    <util:RegistrySearch
        Root="HKLM"
        Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
        Value="Version"
        Variable="Netfx4x64FullVersion"
        Win64="yes" />

    <PackageGroup Id="Netfx4Full">
      <ExePackage
          Id="Netfx4Full"
          Cache="no"
          Compressed="no"
          PerMachine="yes"
          Permanent="yes"
          Vital="yes"
          SourceFile="dotNetFx40_Full_x86_x64.exe"
          DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"
          DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)" />
    </PackageGroup>
  </Fragment>
</Wix>

3 个答案:

答案 0 :(得分:5)

您缺少Burn启动自定义BA所需的一些配置。如果初始化和加载BA失败,则启动先决条件安装程序。在您的情况下.Net Framework。

您必须添加“BootstrapperCore.config”文件作为有效负载才能使自定义BA运行。 BoostrapperCore.config告诉刻录引擎如何初始化自定义BA。

您的BootstrapperApplicationRef应如下所示

  <BootstrapperApplicationRef Id='ManagedBootstrapperApplicationHost'>
    <Payload SourceFile='MyBA.dll' />
    <Payload SourceFile='BootstrapperCore.config' />
  </BootstrapperApplicationRef>

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" />
   </startup>
   <wix.bootstrapper>
      <host assemblyName="MyBA">
         <supportedFramework version="v4\Full" />
         <supportedFramework version="v4\Client" />
      </host>
   </wix.bootstrapper>
</configuration>

将没有扩展名的程序集名称写入属性“assemblyName”。

还要确保将以下条目添加到BA程序集的assemblyinfo.cs中,其中MyNamespace.MyBA是类的名称,包括从WiXBootstrapper.BootstrapperApplication派生的完整命名空间名称

[assembly: BootstrapperApplication(typeof(MyNamespace.MyBA))]

答案 1 :(得分:2)

WIX Bootstrapper默认启动Framework安装,当它无法加载MBA时。使用简单的消息框检查您的MBA是否已加载。

您可以在运行()功能中使用以下代码来确保这一点。

    protected override void Run()
    {
        this.Engine.Log(LogLevel.Verbose, "Running the TestBA.");
        MessageBox.Show("MBA is loaded");
        this.Engine.Quit(0);
    }

确保您已在程序集信息文件中包含MBA类名称。

[assembly: BootstrapperApplication(typeof(TestBA))]

检查%temp%位置中的Bootstrapper日志文件,找出错误的根本原因。

我引用了this示例来启动Bootstrapper应用程序。这可能对你有所帮助。

答案 2 :(得分:0)

Burn创建一个日志 - 它说什么?听起来你的DetectCondition是错误的。为什么不使用.NET的WiX软件包?他们有正确的搜索和条件。