Как я могу установить .NET Framework 3.5 в Windows 8 и Windows Server 2012 с WiX Burn?

Руководство WiX включает "Как: установить .NET Framework с помощью Burn". Однако эти инструкции, похоже, не работают для установки .NET Framework 3.5 в Windows 8, Windows Server 2012 и более поздних операционных системах. См. этот вопрос о StackOverflow и особенно обсуждение этого списка рассылки пользователей wix подробности. Установщик Microsoft .NET Framework 3.5 с пакетом обновления 1 (полный пакет) не запустится, потому что вам нужно использовать обслуживание образов развертывания и Управление (DISM.exe) или какой-либо другой метод, позволяющий включить запрашиваемую структуру в качестве функции Windows. Предлагаемая командная строка выглядит следующим образом, если Windows установлена ​​в месте по умолчанию:

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

Есть ли чистый способ гарантировать, что .NET Framework 3.5 будет установлен в Windows 8 и Windows Server 2012 с WiX? Есть ли хороший способ включить такой шаг в цепочку установки?


person Dan Jagnow    schedule 07.11.2014    source источник
comment
По-видимому, 32-битный DISM.exe предназначен для немедленного сбоя в 64-битной Windows (а не для пересылки команды в 64-битную версию, как, например, procxp.exe). Итак, чтобы использовать DISM, вам нужно найти 64-битную версию в 64-битной Windows. % WINDIR% \ sysnative \ работает как расположение в 64-битной Windows, но не в 32-битной Windows.   -  person Tom Blodget    schedule 10.11.2014
comment
@TomBlodget, спасибо за предупреждение об использовании этого подхода в 32-битных системах. Я могу подтвердить, что это проблема.   -  person Dan Jagnow    schedule 10.11.2014


Ответы (2)


Вот лучшее, что мне удалось придумать. Я добавил фрагмент, который может установить .NET Framework 3.5 для операционных систем до Windows 8 и Windows Server 2012. Обратите внимание, что для этого требуется ссылка на NetFxExtension для определения NETFRAMEWORK35_SP_LEVEL.

<?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();
}

Ниже приводится метод, который вызывает программуdem.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;
    }
}
person Dan Jagnow    schedule 11.11.2014

Вот как установить dot net с помощью загрузчика wix http://wixtoolset.org/documentation/manual/v3/howtos/redistributables_and_install_checks/install_dotnet.html

person LeoN    schedule 08.11.2014
comment
Спасибо, @LeoN, но, как я уже упоминал в вопросе, эти инструкции не работают для Windows 8 и Windows Server 2012. - person Dan Jagnow; 10.11.2014