diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs index 87acd652e..5f528926b 100644 --- a/MediaBrowser.ServerApplication/MainStartup.cs +++ b/MediaBrowser.ServerApplication/MainStartup.cs @@ -256,6 +256,9 @@ namespace MediaBrowser.ServerApplication task = InstallVcredistIfNeeded(_appHost, _logger); Task.WaitAll(task); + task = InstallFrameworkV46IfNeeded(_logger); + Task.WaitAll(task); + SystemEvents.SessionEnding += SystemEvents_SessionEnding; SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; @@ -573,6 +576,93 @@ namespace MediaBrowser.ServerApplication } } + private static async Task InstallFrameworkV46IfNeeded(ILogger logger) + { + bool installFrameworkV46 = false; + + try + { + using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32) + .OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) + { + if (ndpKey != null && ndpKey.GetValue("Release") != null) + { + if ((int)ndpKey.GetValue("Release") <= 393295) + { + //Found framework V4, but not yet V4.6 + installFrameworkV46 = true; + } + } + else + { + //Nothing found in the registry for V4 + installFrameworkV46 = true; + } + } + } + catch (Exception ex) + { + logger.ErrorException("Error getting .NET Framework version", ex); + } + + _logger.Info(".NET Framework 4.6 found: {0}", !installFrameworkV46); + + if (installFrameworkV46) + { + try + { + await InstallFrameworkV46().ConfigureAwait(false); + } + catch (Exception ex) + { + logger.ErrorException("Error installing .NET Framework version 4.6", ex); + } + } + } + + private static async Task InstallFrameworkV46() + { + var httpClient = _appHost.HttpClient; + + var tmp = await httpClient.GetTempFile(new HttpRequestOptions + { + Url = "https://github.com/MediaBrowser/Emby.Resources/raw/master/netframeworkV46/NDP46-KB3045560-Web.exe", + Progress = new Progress() + + }).ConfigureAwait(false); + + var exePath = Path.ChangeExtension(tmp, ".exe"); + File.Copy(tmp, exePath); + + var startInfo = new ProcessStartInfo + { + FileName = exePath, + + CreateNoWindow = true, + WindowStyle = ProcessWindowStyle.Hidden, + Verb = "runas", + ErrorDialog = false, + Arguments = "/q /norestart" + }; + + + _logger.Info("Running {0}", startInfo.FileName); + + using (var process = Process.Start(startInfo)) + { + process.WaitForExit(); + //process.ExitCode + /* + 0 --> Installation completed successfully. + 1602 --> The user canceled installation. + 1603 --> A fatal error occurred during installation. + 1641 --> A restart is required to complete the installation. This message indicates success. + 3010 --> A restart is required to complete the installation. This message indicates success. + 5100 --> The user's computer does not meet system requirements. + */ + } + } + private static async Task InstallVcredistIfNeeded(ApplicationHost appHost, ILogger logger) { try