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

glo*_*ver 4 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>
Run Code Online (Sandbox Code Playgroud)

小智 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

将没有扩展名的程序集的名称写入属性"assemblyName".

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

[assembly: BootstrapperApplication(typeof(MyNamespace.MyBA))]
Run Code Online (Sandbox Code Playgroud)


Vin*_*oth 3

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

您可以在Run()函数中使用以下代码来确保这一点。

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

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

[assembly: BootstrapperApplication(typeof(TestBA))]
Run Code Online (Sandbox Code Playgroud)

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

我参考这个示例来启动 Bootstrapper 应用程序。这可能对你有帮助。