如何使用 WiX Burn 在 Windows 8 和 Windows Server 2012 上安装 .NET Framework 3.5?

Posted

技术标签:

【中文标题】如何使用 WiX Burn 在 Windows 8 和 Windows Server 2012 上安装 .NET Framework 3.5?【英文标题】:How can I install .NET Framework 3.5 on Windows 8 and Windows Server 2012 with WiX Burn? 【发布时间】:2014-11-07 16:39:11 【问题描述】:

WiX 手册包括“How To: Install the .NET Framework Using Burn”。但是,这些说明似乎不适用于在 Windows 8、Windows Server 2012 和更高版本的操作系统上安装 .NET Framework 3.5。有关详细信息,请参阅this *** question,尤其是this wix-users mailing list discussion。 Microsoft .NET Framework 3.5 Service pack 1 (Full Package) installer 不会运行,因为您需要使用 Deployment Image Servicing and Management (DISM.exe) 或其他一些技术来启用请求的框架作为 Windows 功能。建议的命令行如下,假设 Windows 安装在默认位置:

C:\Windows\system32\dism.exe /online /norestart /enable-feature /featurename:netfx3

是否有一种干净的方法来确保 .NET Framework 3.5 将安装在带有 WiX 的 Windows 8 和 Windows Server 2012 上?有没有一种好方法可以在安装链中包含这样的步骤?

【问题讨论】:

显然,32 位 dism.exe 旨在在 64 位 Windows 上立即失败(而不是将命令转发到 64 位版本,例如 procexp.exe 确实如此) .因此,要使用 dism,您必须在 64 位 Windows 上找到 64 位版本。 %WINDIR%\sysnative\ 用作 64 位 Windows 上的位置,但不适用于 32 位 Windows。 @TomBlodget,感谢有关在 32 位系统上使用此方法的警告。我可以确认这是一个问题。 【参考方案1】:

这是我能想到的最好的。我添加了一个片段,它可以为 Windows 8 和 Windows Server 2012 之前的操作系统安装 .NET Framework 3.5。请注意,这需要对 NETFRAMEWORK35_SP_LEVEL 定义的 NetFxExtension 引用。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
  <Fragment>
    <util:RegistrySearchRef Id="NETFRAMEWORK35_SP_LEVEL"/>    
    <PackageGroup Id="NetFx35Redist">
      <ExePackage
          SourceFile="a path on my network\Microsoft\DotNetFx\3.5\dotnetfx35.exe"
          DisplayName="Microsoft .NET Framework 3.5 Full"
          InstallCondition="VersionNT &lt; v6.1"
          InstallCommand="/q /norestart"
          RepairCommand="/q /norestart /f"
          UninstallCommand="/q /norestart /uninstall"
          PerMachine="yes"
          DetectCondition="NETFRAMEWORK35_SP_LEVEL &gt;= 1"
          Id="dotnetfx35.exe"
          Vital="yes"
          Permanent="yes"
          Protocol="none"
          Compressed="yes"
          Name="redist\dotnetfx35.exe">
        <!-- Exit codes
             0 = Successful installation.
          3010 = Successful installation; however, a system reboot is required.
        -->
        <ExitCode Value="0" Behavior="success" />
        <ExitCode Value="3010" Behavior="forceReboot" />
        <ExitCode Behavior="error"/>
      </ExePackage>
    </PackageGroup>
  </Fragment>
</Wix>

在我的托管引导程序代码中,我在应用阶段开始时处理 Windows 8/Windows Server 2012:

model.Bootstrapper.ApplyBegin += this.ApplyBegin;

...

private void ApplyBegin(object sender, ApplyBeginEventArgs e)

    this.EnsureNetFramework35();

调用 dism.exe 以启用 .NET Framework 3.5 的方法如下。一些代码引用了诸如ProgressViewModel 之类的类,它们不会出现在每个托管引导程序实现中,但我希望这为实现您自己的版本提供了一个有用的起点。

/// <summary>
/// Make sure we have the .NET Framework 3.5 when we're on Windows 8, Windows Server 2012, or later.
/// </summary>
private void EnsureNetFramework35()

    // Don't worry if we're on an older OS.  We don't need DISM.exe in that case.
    if (Environment.OSVersion.Version < new Version(6, 1) && this.root.Model.Engine.NumericVariables.Contains("NETFRAMEWORK35_SP_LEVEL"))
    
        return;
    

    // Don't worry if .NET Framework 3.5 is already installed.
    if (this.root.Model.Engine.NumericVariables.Contains("NETFRAMEWORK35_SP_LEVEL") &&
        this.root.Model.Engine.NumericVariables["NETFRAMEWORK35_SP_LEVEL"] >= 1)
    
        return;
    

    // Enable .NET Framework 3.5.
    this.root.Model.Engine.Log(LogLevel.Standard, "Enabling .NET Framework 3.5.");
    this.root.ProgressViewModel.Message = "Enabling .NET Framework 3.5.";

    // Get the path to DISM.exe.
    string windowsPath = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
    string systemPath = Path.Combine(windowsPath, "System32");
    if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
    
        // For 32-bit processes on 64-bit systems, %windir%\system32 folder
        // can only be accessed by specifying %windir%\sysnative folder.
        systemPath = Path.Combine(windowsPath, "SysNative");
    

    string dismPath = Path.Combine(systemPath, @"dism.exe");
    string arguments = "/online /enable-feature:NetFx3 /quiet /norestart";

    if (!File.Exists(dismPath))
    
        this.root.Model.Engine.Log(LogLevel.Error, "Could not find file: " + dismPath);
        return;
    

    this.root.Model.Engine.Log(LogLevel.Standard, dismPath + " " + arguments);
    this.root.ProgressViewModel.DetailMessage = dismPath + " " + arguments;

    Process process = new Process();
    process.StartInfo.FileName = dismPath;
    process.StartInfo.Arguments = arguments;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.Start();
    process.WaitForExit();

    // Check to see if we encountered any errors.
    if (process.ExitCode == 0)
    
        this.root.Model.Engine.Log(LogLevel.Standard, ".NET Framework 3.5 enabled.");
        this.root.ProgressViewModel.Message = ".NET Framework 3.5 enabled.";
        this.root.ProgressViewModel.DetailMessage = string.Empty;
    
    else
    
        this.root.Model.Engine.Log(LogLevel.Error, ".NET Framework 3.5 could not be enabled.  Exit code: " + process.ExitCode);
        this.root.ProgressViewModel.Message = ".NET Framework 3.5 could not be enabled.";
        this.root.ProgressViewModel.DetailMessage = string.Empty;
    

【讨论】:

【参考方案2】:

这是如何使用 wix bootsrapper 安装 dot net http://wixtoolset.org/documentation/manual/v3/howtos/redistributables_and_install_checks/install_dotnet.html

【讨论】:

谢谢@LeoN,但正如我在问题中提到的那样,这些说明似乎不适用于 Windows 8 和 Windows Server 2012。

以上是关于如何使用 WiX Burn 在 Windows 8 和 Windows Server 2012 上安装 .NET Framework 3.5?的主要内容,如果未能解决你的问题,请参考以下文章

WiX Burn:如何将安装程序可执行文件部署到某个位置?

如何将文件添加到 WiX Burn 中的 Container 元素?

Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序

Wix Burn,我如何允许降级?

如何获得 Wix Burn 捆绑包以阻止升级

WiX - Burn 支持两用 msi 包吗?