|
|
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Security;
- using System.Text;
- using System.Threading;
- using amecs.Misc;
- using Ameliorated.ConsoleUtils;
- using Microsoft.Dism;
-
- namespace amecs.Actions
- {
- public class _NET
- {
- private static string _mountedPath;
- private static string _isoPath;
-
- private static void Unmount()
- {
- if (_isoPath == "none")
- return;
-
- SelectWindowsImage.DismountIso(_isoPath);
- }
-
- public static bool Install()
- {
- (_mountedPath, _isoPath, _, _, _) = SelectWindowsImage.GetMediaPath(true);
- if (_mountedPath == null) return false;
-
- if (!Directory.Exists(_mountedPath + @"\sources\sxs") || !Directory.GetFiles(_mountedPath + @"\sources\sxs", "*netfx3*").Any())
- {
- Unmount();
- Console.WriteLine();
- ConsoleTUI.OpenFrame.Close("ISO/USB/folder does not contain the required files.",
- ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() { AnyKey = true, Text = "Press any key to return to the Menu: " });
- return false;
- }
-
- ConsoleTUI.OpenFrame.WriteCentered("\r\nInstalling .NET 3.5");
- var topCache = Console.CursorTop;
- var leftCache = Console.CursorLeft;
- Console.WriteLine();
- var inProgress = false;
- try
- {
- using var indicator = new ConsoleUtils.LoadingIndicator();
- DismApi.Initialize(DismLogLevel.LogErrors);
- using (var session = DismApi.OpenOnlineSession())
- {
- var stdout = GetStdHandle(-11);
- var indicatorStopped = false;
- var maxHashTags = (ConsoleTUI.OpenFrame.DisplayWidth - 5);
- DismApi.EnableFeatureByPackagePath(session, "NetFX3", null, true, true, new List<string>() { _mountedPath + @"\sources\sxs" }, delegate(DismProgress progress)
- {
- inProgress = true;
- if (!indicatorStopped)
- {
- indicator.Stop();
- Console.SetCursorPosition(leftCache, topCache);
- Console.WriteLine(" ");
- }
-
- indicatorStopped = true;
- var progressPercentage = progress.Current / 10;
- var currentHashTags = (int)Math.Ceiling(Math.Min(((double)progressPercentage / 100) * maxHashTags, maxHashTags));
- var spaces = maxHashTags - currentHashTags + (4 - progressPercentage.ToString().Length);
- var sb = new StringBuilder(new string('#', currentHashTags) + new string(' ', spaces) + progressPercentage + "%");
- WriteConsoleOutputCharacter(stdout, sb, (uint)sb.Length, new Languages.COORD((short)ConsoleTUI.OpenFrame.DisplayOffset, (short)Console.CursorTop), out _);
- inProgress = false;
- });
- session.Close();
- Thread.Sleep(100);
- var sb = new StringBuilder(new string('#', maxHashTags) + " 100%");
- uint throwaway;
- WriteConsoleOutputCharacter(stdout, sb, (uint)sb.Length, new Languages.COORD((short)ConsoleTUI.OpenFrame.DisplayOffset, (short)Console.CursorTop), out throwaway);
- }
-
- DismApi.Shutdown();
- Unmount();
- } catch (Exception e)
- {
- while (inProgress)
- {
- Thread.Sleep(50);
- }
-
- Unmount();
-
- Console.WriteLine();
- Console.WriteLine();
- ConsoleTUI.OpenFrame.Close("DISM error: " + e.Message, ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt()
- {
- AnyKey = true,
- Text = "Press any key to return to the Menu: "
- });
- return false;
- }
-
- Console.WriteLine();
- Console.WriteLine();
- ConsoleTUI.OpenFrame.Close(".NET 3.5 installed successfully", ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt()
- {
- AnyKey = true,
- Text = "Press any key to return to the Menu: "
- });
- return true;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct COORD
- {
- public short X;
- public short Y;
-
- public COORD(short X, short Y)
- {
- this.X = X;
- this.Y = Y;
- }
- };
-
- [DllImport("kernel32.dll", SetLastError = true)]
- internal static extern bool WriteConsoleOutputCharacter(IntPtr hConsoleOutput, StringBuilder lpCharacter, uint nLength, Languages.COORD dwWriteCoord, out uint lpNumberOfCharsWritten);
-
- [DllImport("kernel32.dll", SetLastError = true)]
- static extern IntPtr GetStdHandle(int nStdHandle);
- }
- }
|