WiX手册包含“How To: Install the .NET Framework Using Burn”。但是,这些说明似乎不适用于在Windows 8,Windows Server 2012和更高版本的操作系统上安装.NET Framework 3.5。有关详细信息,请参阅this StackOverflow 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
是否有一种干净的方法可以确保在Windows 8和带有WiX的Windows Server 2012上安装.NET Framework 3.5?有没有一种方法可以在安装链中包含这样的步骤?
答案 0 :(得分: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 < v6.1"
InstallCommand="/q /norestart"
RepairCommand="/q /norestart /f"
UninstallCommand="/q /norestart /uninstall"
PerMachine="yes"
DetectCondition="NETFRAMEWORK35_SP_LEVEL >= 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;
}
}
答案 1 :(得分:0)
这是如何使用wix bootstrapper安装dotnet的 http://wixtoolset.org/documentation/manual/v3/howtos/redistributables_and_install_checks/install_dotnet.html