From 7599819edb9916df0fdc778a407199eee86297ab Mon Sep 17 00:00:00 2001 From: Alexander <babaev-an@babaev-an.ru> Date: Sun, 16 Oct 2022 08:45:22 +0300 Subject: [PATCH] 20221016 --- MSOUI.csproj | 46 ------ MSOUI.sln | 8 +- MSOUI.sln.DotSettings | 2 - Program.cs | 78 --------- Properties/Resources.Designer.cs | 153 ------------------ Properties/Resources.resx | 131 --------------- app.manifest | 79 --------- msou_installer/Forms/ExecuterForm.Designer.cs | 50 ------ msou_installer/Forms/ExecuterForm.cs | 18 --- msou_installer/Forms/InstallForm.Designer.cs | 124 ++++++++++++++ msou_installer/Forms/InstallForm.cs | 75 +++++++++ .../{ExecuterForm.resx => InstallForm.resx} | 6 + msou_installer/Forms/MainForm.Designer.cs | 14 +- msou_installer/Forms/MainForm.cs | 17 +- msou_installer/Forms/MainForm.resx | 60 +++++++ msou_installer/Forms/UnPackForm.cs | 2 +- .../Forms/UpdatesListForm.Designer.cs | 3 +- msou_installer/Forms/UpdatesListForm.cs | 21 ++- msou_installer/arrow-down-square.ico | Bin 0 -> 3262 bytes msou_installer/msou_installer.csproj | 6 + 20 files changed, 308 insertions(+), 585 deletions(-) delete mode 100644 MSOUI.csproj delete mode 100644 MSOUI.sln.DotSettings delete mode 100644 Program.cs delete mode 100644 Properties/Resources.Designer.cs delete mode 100644 Properties/Resources.resx delete mode 100644 app.manifest delete mode 100644 msou_installer/Forms/ExecuterForm.Designer.cs delete mode 100644 msou_installer/Forms/ExecuterForm.cs create mode 100644 msou_installer/Forms/InstallForm.Designer.cs create mode 100644 msou_installer/Forms/InstallForm.cs rename msou_installer/Forms/{ExecuterForm.resx => InstallForm.resx} (87%) create mode 100644 msou_installer/arrow-down-square.ico diff --git a/MSOUI.csproj b/MSOUI.csproj deleted file mode 100644 index fae346b..0000000 --- a/MSOUI.csproj +++ /dev/null @@ -1,46 +0,0 @@ -<Project Sdk="Microsoft.NET.Sdk"> - - <PropertyGroup> - <OutputType>Exe</OutputType> - <TargetFramework>net6.0</TargetFramework> - <StartupObject>MSOUI.Program</StartupObject> - <ApplicationManifest>app.manifest</ApplicationManifest> - <ImplicitUsings>enable</ImplicitUsings> - <Nullable>enable</Nullable> - </PropertyGroup> - - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> - <DebugType>none</DebugType> - <DebugSymbols>false</DebugSymbols> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - - <ItemGroup> - <Compile Remove="mso_updates\**" /> - <Compile Remove="releases\**" /> - <EmbeddedResource Remove="mso_updates\**" /> - <EmbeddedResource Remove="releases\**" /> - <None Remove="mso_updates\**" /> - <None Remove="releases\**" /> - </ItemGroup> - - <ItemGroup> - <Compile Update="Properties\Resources.Designer.cs"> - <DesignTime>True</DesignTime> - <AutoGen>True</AutoGen> - <DependentUpon>Resources.resx</DependentUpon> - </Compile> - </ItemGroup> - - <ItemGroup> - <EmbeddedResource Update="Properties\Resources.resx"> - <Generator>ResXFileCodeGenerator</Generator> - <LastGenOutput>Resources.Designer.cs</LastGenOutput> - </EmbeddedResource> - </ItemGroup> - -</Project> diff --git a/MSOUI.sln b/MSOUI.sln index d494f7a..dc57eed 100644 --- a/MSOUI.sln +++ b/MSOUI.sln @@ -3,9 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.3.32929.385 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MSOUI", "MSOUI.csproj", "{B7E4991D-99A9-4189-BCD9-557E04CA4473}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "msou_installer", "msou_installer\msou_installer.csproj", "{E86E8BBF-8830-4259-9DEE-6F3EFC284443}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "msou_installer", "msou_installer\msou_installer.csproj", "{E86E8BBF-8830-4259-9DEE-6F3EFC284443}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -13,10 +11,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B7E4991D-99A9-4189-BCD9-557E04CA4473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B7E4991D-99A9-4189-BCD9-557E04CA4473}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B7E4991D-99A9-4189-BCD9-557E04CA4473}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B7E4991D-99A9-4189-BCD9-557E04CA4473}.Release|Any CPU.Build.0 = Release|Any CPU {E86E8BBF-8830-4259-9DEE-6F3EFC284443}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E86E8BBF-8830-4259-9DEE-6F3EFC284443}.Debug|Any CPU.Build.0 = Debug|Any CPU {E86E8BBF-8830-4259-9DEE-6F3EFC284443}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/MSOUI.sln.DotSettings b/MSOUI.sln.DotSettings deleted file mode 100644 index e41268c..0000000 --- a/MSOUI.sln.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ -<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> - <s:Boolean x:Key="/Default/UserDictionary/Words/=msoui/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary> \ No newline at end of file diff --git a/Program.cs b/Program.cs deleted file mode 100644 index 7a4a8ff..0000000 --- a/Program.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System.Diagnostics; -using MSOUI.Properties; - -namespace MSOUI; - -internal static class Program -{ - private static void Main () - { - string folder = $"{Directory.GetCurrentDirectory()}\\mso_updates\\"; - if (!Directory.Exists (folder)) - { - Console.WriteLine(Resources.FolderNotExist, folder); - Console.ReadLine (); - return; - } - string Mask = "*.exe"; - List<string> fileList = new(); - ScanForFiles(ref fileList, folder, Mask); - Console.WriteLine(Resources.StartUpdateMessage); - string? isAcceptStr = Console.ReadLine(); - if ((isAcceptStr ?? "n").ToLower() == "y") - InstallUpdates(ref fileList, folder); - Console.WriteLine(Resources.ProgramIsFinish); - Console.ReadLine(); - } - public static void StartProcess (string fileName) - { - Process process = new(); - process.StartInfo.FileName = fileName; - process.StartInfo.Arguments = "/q /norestart"; - process.StartInfo.CreateNoWindow = false; - process.EnableRaisingEvents = true; - process.Exited += (_, _) => Console.WriteLine(Resources.ProcessWasFinishedWithCode, process.ExitTime, process.ExitCode); - process.Start(); - process.WaitForExit(); - } - public static void InstallUpdates (ref List<string> fileList, string folder) - { - Console.WriteLine(Resources.StartingUpdate); - - int updatesCount = fileList.Count; - - Console.WriteLine(Resources.UpdateCountMessage, updatesCount); - - int count = 0; - - foreach (string? file in fileList) - { - count++; - - decimal percentDone = Math.Round((decimal)count / updatesCount * 100); - - Console.WriteLine(Resources.UpdatingFile, file, count, updatesCount, percentDone); - StartProcess($"{folder}{file}"); - Console.WriteLine(Resources.FileWasUpdated, file); - } - } - public static void ScanForFiles (ref List<string> fileList, string folder, string mask) - { - Console.WriteLine(Resources.SearchStarted); - Console.WriteLine($@" {folder}"); - Console.WriteLine(Resources.ListOfFoundFiles); - foreach (string fFile in Directory.EnumerateFiles(folder, mask, SearchOption.AllDirectories)) - { - try - { - FileInfo fInfo = new(fFile); - fileList.Add(fInfo.Name); - Console.WriteLine($@" {fInfo.Name}"); - } - catch - { - // ignored - } - } - } -} \ No newline at end of file diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs deleted file mode 100644 index b8c5aea..0000000 --- a/Properties/Resources.Designer.cs +++ /dev/null @@ -1,153 +0,0 @@ -//------------------------------------------------------------------------------ -// <auto-generated> -// Этот код создан программой. -// Исполняемая версия:4.0.30319.42000 -// -// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае -// повторной генерации кода. -// </auto-generated> -//------------------------------------------------------------------------------ - -namespace MSOUI.Properties { - using System; - - - /// <summary> - /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. - /// </summary> - // Этот класс создан автоматически классом StronglyTypedResourceBuilder - // с помощью такого средства, как ResGen или Visual Studio. - // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen - // с параметром /str или перестройте свой проект VS. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// <summary> - /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MSOUI.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// <summary> - /// Перезаписывает свойство CurrentUICulture текущего потока для всех - /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на Файл "{0}" установлен!. - /// </summary> - internal static string FileWasUpdated { - get { - return ResourceManager.GetString("FileWasUpdated", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на Директории «{0}» не существует!. - /// </summary> - internal static string FolderNotExist { - get { - return ResourceManager.GetString("FolderNotExist", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на СПИСОК НАЙДЕННЫХ ФАЙЛОВ:. - /// </summary> - internal static string ListOfFoundFiles { - get { - return ResourceManager.GetString("ListOfFoundFiles", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на [{0}] Процесс завершен с кодом {1}.. - /// </summary> - internal static string ProcessWasFinishedWithCode { - get { - return ResourceManager.GetString("ProcessWasFinishedWithCode", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на Работа программы завершена. Нажмите "Enter" для выхода.. - /// </summary> - internal static string ProgramIsFinish { - get { - return ResourceManager.GetString("ProgramIsFinish", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на Начинаю поиск исполняемых файлов в папке:. - /// </summary> - internal static string SearchStarted { - get { - return ResourceManager.GetString("SearchStarted", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на Начинаю установку.... - /// </summary> - internal static string StartingUpdate { - get { - return ResourceManager.GetString("StartingUpdate", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на Приступить к установке обновлений? [Y, y - да, любая другая клавиша - нет]. - /// </summary> - internal static string StartUpdateMessage { - get { - return ResourceManager.GetString("StartUpdateMessage", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на Выбрано {0} обновлений для установки.... - /// </summary> - internal static string UpdateCountMessage { - get { - return ResourceManager.GetString("UpdateCountMessage", resourceCulture); - } - } - - /// <summary> - /// Ищет локализованную строку, похожую на Устанавливается файл "{0}" [{1} из {2}, {3}%].... - /// </summary> - internal static string UpdatingFile { - get { - return ResourceManager.GetString("UpdatingFile", resourceCulture); - } - } - } -} diff --git a/Properties/Resources.resx b/Properties/Resources.resx deleted file mode 100644 index 10c73bd..0000000 --- a/Properties/Resources.resx +++ /dev/null @@ -1,131 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<root> - <!-- - Microsoft ResX Schema - - Version 1.3 - - The primary goals of this format is to allow a simple XML format - that is mostly human readable. The generation and parsing of the - various data types are done through the TypeConverter classes - associated with the data types. - - Example: - - ... ado.net/XML headers & schema ... - <resheader name="resmimetype">text/microsoft-resx</resheader> - <resheader name="version">1.3</resheader> - <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> - <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> - <data name="Name1">this is my long string</data> - <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> - <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> - [base64 mime encoded serialized .NET Framework object] - </data> - <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> - [base64 mime encoded string representing a byte array form of the .NET Framework object] - </data> - - There are any number of "resheader" rows that contain simple - name/value pairs. - - Each data row contains a name, and value. The row also contains a - type or mimetype. Type corresponds to a .NET class that support - text/value conversion through the TypeConverter architecture. - Classes that don't support this are serialized and stored with the - mimetype set. - - The mimetype is used for serialized objects, and tells the - ResXResourceReader how to depersist the object. This is currently not - extensible. For a given mimetype the value must be set accordingly: - - Note - application/x-microsoft.net.object.binary.base64 is the format - that the ResXResourceWriter will generate, however the reader can - read any of the formats listed below. - - mimetype: application/x-microsoft.net.object.binary.base64 - value : The object must be serialized with - : System.Serialization.Formatters.Binary.BinaryFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.soap.base64 - value : The object must be serialized with - : System.Runtime.Serialization.Formatters.Soap.SoapFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.bytearray.base64 - value : The object must be serialized into a byte array - : using a System.ComponentModel.TypeConverter - : and then encoded with base64 encoding. - --> - - <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - <xsd:element name="root" msdata:IsDataSet="true"> - <xsd:complexType> - <xsd:choice maxOccurs="unbounded"> - <xsd:element name="data"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> - <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> - <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="resheader"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" use="required" /> - </xsd:complexType> - </xsd:element> - </xsd:choice> - </xsd:complexType> - </xsd:element> - </xsd:schema> - <resheader name="resmimetype"> - <value>text/microsoft-resx</value> - </resheader> - <resheader name="version"> - <value>1.3</value> - </resheader> - <resheader name="reader"> - <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> - <resheader name="writer"> - <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> - <data name="ProcessWasFinishedWithCode" xml:space="preserve"> - <value>[{0}] Процесс завершен с кодом {1}.</value> - </data> - <data name="FolderNotExist" xml:space="preserve"> - <value>Директории «{0}» не существует!</value> - </data> - <data name="StartUpdateMessage" xml:space="preserve"> - <value>Приступить к установке обновлений? [Y, y - да, любая другая клавиша - нет]</value> - </data> - <data name="ProgramIsFinish" xml:space="preserve"> - <value>Работа программы завершена. Нажмите "Enter" для выхода.</value> - </data> - <data name="StartingUpdate" xml:space="preserve"> - <value>Начинаю установку...</value> - </data> - <data name="UpdateCountMessage" xml:space="preserve"> - <value>Выбрано {0} обновлений для установки...</value> - </data> - <data name="UpdatingFile" xml:space="preserve"> - <value>Устанавливается файл "{0}" [{1} из {2}, {3}%]...</value> - </data> - <data name="FileWasUpdated" xml:space="preserve"> - <value>Файл "{0}" установлен!</value> - </data> - <data name="SearchStarted" xml:space="preserve"> - <value>Начинаю поиск исполняемых файлов в папке:</value> - </data> - <data name="ListOfFoundFiles" xml:space="preserve"> - <value>СПИСОК НАЙДЕННЫХ ФАЙЛОВ:</value> - </data> -</root> \ No newline at end of file diff --git a/app.manifest b/app.manifest deleted file mode 100644 index 264d5a0..0000000 --- a/app.manifest +++ /dev/null @@ -1,79 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> - <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> - <security> - <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> - <!-- Параметры манифеста UAC - Если вы хотите изменить уровень контроля учетных записей Windows, замените узел - requestedExecutionLevel на один из следующих. - - <requestedExecutionLevel level="asInvoker" uiAccess="false" /> - <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> - <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> - - При указании элемента requestedExecutionLevel будет отключена виртуализация файлов и реестра. - Удалите этот элемент, если виртуализация требуется приложению для обратной - совместимости. - --> - <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> - </requestedPrivileges> - </security> - </trustInfo> - - <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> - <application> - <!-- Список версий Windows, на которых это приложение было протестировано - и будет работать. Раскомментируйте соответствующие элементы, чтобы ОС Windows - автоматически выбрала наиболее совместимое окружение. --> - - <!-- Windows Vista --> - <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />--> - - <!-- Windows 7 --> - <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />--> - - <!-- Windows 8 --> - <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />--> - - <!-- Windows 8.1 --> - <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />--> - - <!-- Windows 10 --> - <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />--> - - </application> - </compatibility> - - <!-- Указывает, что приложение поддерживает определение DPI и не будет автоматически масштабироваться Windows при более высоких - значениях DPI. Приложения Windows Presentation Foundation (WPF) по умолчанию поддерживают определение DPI, им не нужно - специально включать параметр для этого. Для приложений Windows Forms на платформе .NET Framework 4.6, для которых задан этот параметр, необходимо - также задать для "EnableWindowsFormsHighDpiAutoResizing" значение "true" в файле app.config. - - При этом приложение начинает учитывать длинные пути. Дополнительные сведения см. на странице https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation.--> - <!-- - <application xmlns="urn:schemas-microsoft-com:asm.v3"> - <windowsSettings> - <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> - <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> - </windowsSettings> - </application> - --> - - <!-- Включите темы для общих элементов управления и диалоговых окон Windows (Windows XP и более поздние версии) --> - <!-- - <dependency> - <dependentAssembly> - <assemblyIdentity - type="win32" - name="Microsoft.Windows.Common-Controls" - version="6.0.0.0" - processorArchitecture="*" - publicKeyToken="6595b64144ccf1df" - language="*" - /> - </dependentAssembly> - </dependency> - --> - -</assembly> diff --git a/msou_installer/Forms/ExecuterForm.Designer.cs b/msou_installer/Forms/ExecuterForm.Designer.cs deleted file mode 100644 index 5d22ff0..0000000 --- a/msou_installer/Forms/ExecuterForm.Designer.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace msoui.Forms; - -partial class ExecuterForm -{ - /// <summary> - /// Required designer variable. - /// </summary> - private System.ComponentModel.IContainer components = null; - - /// <summary> - /// Clean up any resources being used. - /// </summary> - /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> - protected override void Dispose (bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// <summary> - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// </summary> - private void InitializeComponent () - { - this.SuspendLayout(); - // - // ExecuterForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 21F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(496, 180); - this.ControlBox = false; - this.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ExecuterForm"; - this.Text = "Установка обновлений"; - this.ResumeLayout(false); - - } - - #endregion -} \ No newline at end of file diff --git a/msou_installer/Forms/ExecuterForm.cs b/msou_installer/Forms/ExecuterForm.cs deleted file mode 100644 index 621f8c4..0000000 --- a/msou_installer/Forms/ExecuterForm.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace msoui.Forms; -public partial class ExecuterForm: Form -{ - public ExecuterForm () - { - InitializeComponent(); - } -} diff --git a/msou_installer/Forms/InstallForm.Designer.cs b/msou_installer/Forms/InstallForm.Designer.cs new file mode 100644 index 0000000..e36dcac --- /dev/null +++ b/msou_installer/Forms/InstallForm.Designer.cs @@ -0,0 +1,124 @@ +namespace msoui.Forms; + +partial class InstallForm +{ + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose (bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent () + { + this.components = new System.ComponentModel.Container(); + this.actionPanel = new System.Windows.Forms.Panel(); + this.progressBar = new System.Windows.Forms.ProgressBar(); + this.statusLabel = new System.Windows.Forms.Label(); + this.logList = new System.Windows.Forms.ListBox(); + this.process = new System.Diagnostics.Process(); + this.startTimer = new System.Windows.Forms.Timer(this.components); + this.actionPanel.SuspendLayout(); + this.SuspendLayout(); + // + // actionPanel + // + this.actionPanel.Controls.Add(this.progressBar); + this.actionPanel.Controls.Add(this.statusLabel); + this.actionPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.actionPanel.Location = new System.Drawing.Point(0, 0); + this.actionPanel.Name = "actionPanel"; + this.actionPanel.Padding = new System.Windows.Forms.Padding(10); + this.actionPanel.Size = new System.Drawing.Size(496, 91); + this.actionPanel.TabIndex = 5; + // + // progressBar + // + this.progressBar.Dock = System.Windows.Forms.DockStyle.Fill; + this.progressBar.Location = new System.Drawing.Point(10, 59); + this.progressBar.Name = "progressBar"; + this.progressBar.Size = new System.Drawing.Size(476, 22); + this.progressBar.TabIndex = 1; + // + // statusLabel + // + this.statusLabel.Dock = System.Windows.Forms.DockStyle.Top; + this.statusLabel.Location = new System.Drawing.Point(10, 10); + this.statusLabel.Name = "statusLabel"; + this.statusLabel.Size = new System.Drawing.Size(476, 49); + this.statusLabel.TabIndex = 0; + this.statusLabel.Text = "&Начинаю установку..."; + // + // logList + // + this.logList.Dock = System.Windows.Forms.DockStyle.Fill; + this.logList.FormattingEnabled = true; + this.logList.ItemHeight = 21; + this.logList.Location = new System.Drawing.Point(0, 0); + this.logList.Margin = new System.Windows.Forms.Padding(10); + this.logList.Name = "logList"; + this.logList.Size = new System.Drawing.Size(496, 313); + this.logList.TabIndex = 4; + // + // process + // + this.process.StartInfo.Domain = ""; + this.process.StartInfo.LoadUserProfile = false; + this.process.StartInfo.Password = null; + this.process.StartInfo.StandardErrorEncoding = null; + this.process.StartInfo.StandardInputEncoding = null; + this.process.StartInfo.StandardOutputEncoding = null; + this.process.StartInfo.UserName = ""; + this.process.SynchronizingObject = this; + // + // startTimer + // + this.startTimer.Interval = 1000; + this.startTimer.Tick += new System.EventHandler(this.startTimer_Tick); + // + // InstallForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(496, 313); + this.ControlBox = false; + this.Controls.Add(this.actionPanel); + this.Controls.Add(this.logList); + this.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Margin = new System.Windows.Forms.Padding(4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "InstallForm"; + this.Text = "Установка обновлений"; + this.Load += new System.EventHandler(this.InstallForm_Load); + this.actionPanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private Panel actionPanel; + private ProgressBar progressBar; + private Label statusLabel; + private ListBox logList; + private System.Diagnostics.Process process; + private System.Windows.Forms.Timer startTimer; +} \ No newline at end of file diff --git a/msou_installer/Forms/InstallForm.cs b/msou_installer/Forms/InstallForm.cs new file mode 100644 index 0000000..f3534a8 --- /dev/null +++ b/msou_installer/Forms/InstallForm.cs @@ -0,0 +1,75 @@ +namespace msoui.Forms; +public partial class InstallForm: Form +{ + public InstallForm (List<string> fileList, string extractDir) + { + FileList = fileList; + ExtractDir = extractDir; + InitializeComponent(); + } + + public List<string> FileList { get; set; } + + public string ExtractDir { get; set; } + + private void LogIt(string message) + { + logList.Items.Add(message); + } + + private void LogIt (string message, params object?[] args) + { + logList.Items.Add(string.Format(message, args)); + } + + public void StartProcess (string fileName) + { + process.StartInfo.FileName = fileName; + process.StartInfo.Arguments = "/q /norestart"; + process.StartInfo.CreateNoWindow = false; + process.EnableRaisingEvents = true; + process.Exited += (_, _) => LogIt(@"[{0}] Процесс завершен с кодом {1}.", process.ExitTime, process.ExitCode); + process.Start(); + process.WaitForExit(); + } + + + public void InstallUpdates () + { + LogIt("Начинаю установку..."); + + int updatesCount = FileList.Count; + + LogIt("Выбрано {0} обновлений для установки...", updatesCount); + + int count = 0; + + foreach (string? file in FileList) + { + count++; + + decimal percentDone = Math.Round((decimal)count / updatesCount * 100); + + LogIt(@"Устанавливается файл {0} [{1} из {2}, {3}%]...", file, count, updatesCount, percentDone); + StartProcess($"{ExtractDir}{file}"); + LogIt(@"Файл {0} установлен!", file); + } + + MessageBox.Show(@"Набор обновлений успешно установлен!", @"Установка завершена", MessageBoxButtons.OK, + MessageBoxIcon.Asterisk); + + DialogResult = DialogResult.OK; + } + + private void startTimer_Tick (object sender, EventArgs e) + { + startTimer.Enabled = false; + + InstallUpdates(); + } + + private void InstallForm_Load (object sender, EventArgs e) + { + startTimer.Enabled = true; + } +} diff --git a/msou_installer/Forms/ExecuterForm.resx b/msou_installer/Forms/InstallForm.resx similarity index 87% rename from msou_installer/Forms/ExecuterForm.resx rename to msou_installer/Forms/InstallForm.resx index f298a7b..6780448 100644 --- a/msou_installer/Forms/ExecuterForm.resx +++ b/msou_installer/Forms/InstallForm.resx @@ -57,4 +57,10 @@ <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> + <metadata name="process.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <metadata name="startTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>110, 17</value> + </metadata> </root> \ No newline at end of file diff --git a/msou_installer/Forms/MainForm.Designer.cs b/msou_installer/Forms/MainForm.Designer.cs index 0dba9ef..181409e 100644 --- a/msou_installer/Forms/MainForm.Designer.cs +++ b/msou_installer/Forms/MainForm.Designer.cs @@ -28,6 +28,7 @@ sealed partial class MainForm /// </summary> private void InitializeComponent () { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.contentPanel = new System.Windows.Forms.Panel(); this.viewButton = new System.Windows.Forms.Button(); this.bitsSelector64 = new System.Windows.Forms.RadioButton(); @@ -39,7 +40,6 @@ sealed partial class MainForm this.buttonsPanel = new System.Windows.Forms.Panel(); this.exitButton = new System.Windows.Forms.Button(); this.installButton = new System.Windows.Forms.Button(); - this.settingsButton = new System.Windows.Forms.Button(); this.dataFileDialog = new System.Windows.Forms.OpenFileDialog(); this.contentPanel.SuspendLayout(); this.buttonsPanel.SuspendLayout(); @@ -137,7 +137,6 @@ sealed partial class MainForm // this.buttonsPanel.Controls.Add(this.exitButton); this.buttonsPanel.Controls.Add(this.installButton); - this.buttonsPanel.Controls.Add(this.settingsButton); this.buttonsPanel.Dock = System.Windows.Forms.DockStyle.Bottom; this.buttonsPanel.Location = new System.Drawing.Point(0, 214); this.buttonsPanel.Name = "buttonsPanel"; @@ -164,15 +163,6 @@ sealed partial class MainForm this.installButton.UseVisualStyleBackColor = true; this.installButton.Click += new System.EventHandler(this.installButton_Click); // - // settingsButton - // - this.settingsButton.Location = new System.Drawing.Point(12, 13); - this.settingsButton.Name = "settingsButton"; - this.settingsButton.Size = new System.Drawing.Size(110, 33); - this.settingsButton.TabIndex = 0; - this.settingsButton.Text = "&Настройки"; - this.settingsButton.UseVisualStyleBackColor = true; - // // dataFileDialog // this.dataFileDialog.DefaultExt = "data"; @@ -189,6 +179,7 @@ sealed partial class MainForm this.Controls.Add(this.contentPanel); this.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(4); this.MaximizeBox = false; this.MinimizeBox = false; @@ -216,6 +207,5 @@ sealed partial class MainForm private Label titleLabel; private Button exitButton; private Button installButton; - private Button settingsButton; private OpenFileDialog dataFileDialog; } \ No newline at end of file diff --git a/msou_installer/Forms/MainForm.cs b/msou_installer/Forms/MainForm.cs index 971632d..b3cc801 100644 --- a/msou_installer/Forms/MainForm.cs +++ b/msou_installer/Forms/MainForm.cs @@ -51,7 +51,7 @@ public sealed partial class MainForm: Form unPackFrm.Dispose(); //������ ����� ������ ���������� - UpdatesListForm updatesListForm = new UpdatesListForm(updatesList); + UpdatesListForm updatesListForm = new(updatesList); //��������� � DialogResult ulDialogResult = updatesListForm.ShowDialog(); @@ -64,7 +64,20 @@ public sealed partial class MainForm: Form return; } - // + //���������� � + updatesListForm.Dispose(); + + //������ ����� ������ ���������� + InstallForm installForm = new (updatesList, TempWorkDir); + + //��������� � + installForm.ShowDialog(); + + //���������� � + installForm.Dispose(); + + //������ ��� + CleanThis(updatesList); } private void StartForm_Load (object sender, EventArgs e) diff --git a/msou_installer/Forms/MainForm.resx b/msou_installer/Forms/MainForm.resx index 084584e..122bed5 100644 --- a/msou_installer/Forms/MainForm.resx +++ b/msou_installer/Forms/MainForm.resx @@ -60,4 +60,64 @@ <metadata name="dataFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <value>17, 17</value> </metadata> + <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> + <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAABAAEAICAAAAEAGACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGAAAAAAAAAAAAEgAAABIAAAAAAAAAAAA + AAD////V1dVLS0sICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwdHR0fR0dH////X19cPDw8AAAABAQEEBAQEBAQEBAQE + BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE + BAQBAQEAAAAMDAzR0dFRUVEAAABQUFDs7Oz///////////////////////////////////////////// + ///////////////////////////////////////////////////u7u5XV1cAAABISEgPDw8AAADl5eX/ + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////u7u4BAQEHBwcEBAQAAAD7+/v///////////////////////////////// + //////////////////////////////////////////////////////////////////////////8EBAQA + AAAEBAQAAAD7+/v///////////////////////////////////////////////////////////////// + //////////////////////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8EBAQAAAAEBAQAAAD7+/v////////////////////////////////////////////////+ + /v7+/v7///////////////////////////////////////////////////8EBAQAAAAEBAQAAAD7+/v/ + ///////////////////////////////////////////p6ekwMDAqKirl5eX///////////////////// + //////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////////////////////// + ///////p6ekrKysAAAAAAAAmJibl5eX///////////////////////////////////////////8EBAQA + AAAEBAQAAAD7+/v////////////////////////////////////p6ekrKysAAAAAAAAAAAAAAAAmJibl + 5eX///////////////////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////// + ///////////////p6ekrKysAAAAsLCwCAgIAAAAvLy8AAAAmJibl5eX///////////////////////// + //////////8EBAQAAAAEBAQAAAD7+/v////////////////////////////p6ekrKysAAAAsLCzp6ekE + BAQAAADp6ekyMjIAAAAmJibl5eX///////////////////////////////8EBAQAAAAEBAQAAAD7+/v/ + ///////////////////////p6ekrKysAAAAsLCzp6en///8EBAQAAAD7+/vt7e0yMjIAAAAmJibl5eX/ + //////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////////////8zMzMAAAAs + LCzp6en///////8EBAQAAAD7+/v////t7e0yMjIAAAAqKir+/v7///////////////////////8EBAQA + AAAEBAQAAAD7+/v///////////////////////9BQUE0NDTp6en///////////8EBAQAAAD7+/v///// + ///t7e06Ojo4ODj///////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////// + //////////////////////////////8EBAQAAAD7+/v///////////////////////////////////// + //////////8EBAQAAAAEBAQAAAD7+/v///////////////////////////////////////////////8E + BAQAAAD7+/v///////////////////////////////////////////////8EBAQAAAAEBAQAAAD7+/v/ + //////////////////////////////////////////////8EBAQAAAD7+/v///////////////////// + //////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////////////////////// + //////////////8EBAQAAAD7+/v///////////////////////////////////////////////8EBAQA + AAAEBAQAAAD7+/v///////////////////////////////////////////////8EBAQAAAD7+/v///// + //////////////////////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////// + //////////////////////////////8EBAQAAAD7+/v///////////////////////////////////// + //////////8EBAQAAAAEBAQAAAD7+/v///////////////////////////////////////////////8E + BAQAAAD7+/v///////////////////////////////////////////////8EBAQAAAAEBAQAAAD7+/v/ + //////////////////////////////////////////////9BQUE5OTn///////////////////////// + //////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////////////////////// + //////////////////////////////////////////////////////////////////////////8EBAQA + AAAEBAQAAAD7+/v///////////////////////////////////////////////////////////////// + //////////////////////////////////////////8EBAQAAAAEBAQAAAD7+/v///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8EBAQAAAAEBAQAAAD7+/v///////////////////////////////////////////////// + //////////////////////////////////////////////////////////8EBAQAAAAREREAAADj4+P/ + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////r6+sBAQEICAhVVVUAAABJSUni4uL7+/v7+/v7+/v7+/v7+/v7+/v7+/v7 + +/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vl5eVQUFAAAABM + TEzc3NwTExMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBDW1tb////c3NxVVVUREREEBAQEBAQEBAQE + BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE + BAQQEBBRUVHY2Nj///8P///wIAAABEAAAAJAAAAAQAAAAUAAAAFAAAABQAAAAUAAAAFAAYABQAPAAUAE + oAFACJABQBCIAUAghAFAAIABQACAAUAAgAFAAIABQACAAUAAgAFAAIABQACAAUAAAAFAAAABQAAAAUAA + AAFAAAABQAAAAEAAAAI////8AAAAAA== +</value> + </data> </root> \ No newline at end of file diff --git a/msou_installer/Forms/UnPackForm.cs b/msou_installer/Forms/UnPackForm.cs index b6c6212..1e28e0b 100644 --- a/msou_installer/Forms/UnPackForm.cs +++ b/msou_installer/Forms/UnPackForm.cs @@ -78,7 +78,7 @@ public sealed partial class UnPackForm: Form Application.DoEvents(); //Распаковываю файл - //entry.Extract($@"{unPackTo}{unPackFileName}"); + entry.Extract($@"{Model.UnPackDir}{unPackFileName}"); //Добавляю в список файлов if (File.Exists($@"{Model.UnPackDir}{unPackFileName}")) diff --git a/msou_installer/Forms/UpdatesListForm.Designer.cs b/msou_installer/Forms/UpdatesListForm.Designer.cs index a1e18d3..696c7a7 100644 --- a/msou_installer/Forms/UpdatesListForm.Designer.cs +++ b/msou_installer/Forms/UpdatesListForm.Designer.cs @@ -75,6 +75,7 @@ sealed partial class UpdatesListForm this.installButton.TabIndex = 3; this.installButton.Text = "&Установить >"; this.installButton.UseVisualStyleBackColor = true; + this.installButton.Click += new System.EventHandler(this.installButton_Click); // // cancelButton // @@ -84,7 +85,7 @@ sealed partial class UpdatesListForm this.cancelButton.TabIndex = 4; this.cancelButton.Text = "< &Отмена"; this.cancelButton.UseVisualStyleBackColor = true; - this.cancelButton.Click += new System.EventHandler(this.button2_Click); + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); // // selectionStatus // diff --git a/msou_installer/Forms/UpdatesListForm.cs b/msou_installer/Forms/UpdatesListForm.cs index 5d555b4..da58c33 100644 --- a/msou_installer/Forms/UpdatesListForm.cs +++ b/msou_installer/Forms/UpdatesListForm.cs @@ -11,11 +11,6 @@ public sealed partial class UpdatesListForm: Form private const string SelectionStatusLabel = "{0} выбрано из {1}"; - private void button2_Click (object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - private void selectAllButton_Click (object sender, EventArgs e) { for (int index = 0; index < updatesListBox.Items.Count; index++) @@ -34,4 +29,20 @@ public sealed partial class UpdatesListForm: Form { selectionStatus.Text = string.Format(SelectionStatusLabel, updatesListBox.CheckedItems.Count, updatesListBox.Items.Count); } + + private void installButton_Click (object sender, EventArgs e) + { + UpdatesList.Clear(); + + foreach (object checkedItem in updatesListBox.CheckedItems) + { + if (checkedItem.ToString() != null) + UpdatesList.Add(checkedItem.ToString()!); + } + } + + private void cancelButton_Click (object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } } diff --git a/msou_installer/arrow-down-square.ico b/msou_installer/arrow-down-square.ico new file mode 100644 index 0000000000000000000000000000000000000000..27dbf792c71d1e0a63b8615f69cb3355b827d961 GIT binary patch literal 3262 zcmeH~y>7xV5Xa9c5*Z>T2&w9r2~~gu0tR5InFxXb2E^-h=+Lo`(6NuvS76{{U;;59 zKGdD6>7QCy5or^XMqSDwhl^wX{^!#<7$Sy`Z4<6H^kNWQ6VWXix`?A4`j6(oIkcm> zt~(ly+U>Tk>&L#|ekYU3X0tgQ4gsG`CZ=hE$QVn+WIzFE7zQMIy&n8-x4YSFAQy}6 zcDun~0IcIUBKYNU84FoLAc0jNQAi1d_WQkj6qh5&|BC<dWr_(rH$SV@s#q*$vsuMr zIExQ>E|)_kz%rSPiiA4f3s;v=<V$!ypVu@E{6e9ivI-Tx7Y<)cfm14#LM1}^CvcRF zn1ao?-EKoALiy!#89^c~5E3;h`M8x5s3?@Jzi31GjYgwVsYtjtenEpoy<V?YtA4l~ z><#JLVcyONgCk5)d>Mx3#~ZouBLov+$|Zh(=Km)D*b%i_?I-n<{s{GRLI}RS@Ky4Y zN~Q3UTr3vBgU@}sUaxV!!kM<;?}OiJwdV6VHfAh_UuPURf$elUv)L@2PQ#DgEXx{? z$5=QdunHs!6%~ttjAQe3ItAQx-8Y*k!HG1q!~X^5YwVu!t5?Po&y4F&j9ZV4+YcCr R{=i0lmeA1dT=yL=eFD-`r0oCz literal 0 HcmV?d00001 diff --git a/msou_installer/msou_installer.csproj b/msou_installer/msou_installer.csproj index 484e10d..ac5494b 100644 --- a/msou_installer/msou_installer.csproj +++ b/msou_installer/msou_installer.csproj @@ -7,8 +7,14 @@ <UseWindowsForms>true</UseWindowsForms> <ImplicitUsings>enable</ImplicitUsings> <RootNamespace>msoui</RootNamespace> + <StartupObject>msoui.Program</StartupObject> + <ApplicationIcon>arrow-down-square.ico</ApplicationIcon> </PropertyGroup> + <ItemGroup> + <Content Include="arrow-down-square.ico" /> + </ItemGroup> + <ItemGroup> <PackageReference Include="ANBSoftware.ComponentsPack" Version="1.2022.723" /> <PackageReference Include="SevenZipExtractor" Version="1.0.17" />