Как добавить свою программу в установка и удаление программ? На C#

Всем привет! Думаю многих из вас интересовало как же происходит установка чужих программ, как они помещают свои программы в параметры Windows для установки и удаления программ? Напишем собственный установщик программы и Uninstall. Скажу сразу, да есть обертки которые все это позволяют автоматизировать, так же имеется встроенный инсталлятор в самой VS. Однако, когда вам не обходимо вызвать некие методы для проверки или докачки файлов, копирования, или не стандартное поведения вашего ПО. Вам придется писать свой инсталлятор.

Суть проблемы и ее решения.

Сейчас рассмотрим то как можно добавить в Установка и удаление программ, добавить собственную программу и удалить через нее. В примере будет использоваться символичное название нашей программы MyProg.exe

По факту вам надо написать три программы, первая из них это Установщик, сама программа, и программа удаления всех частей программы включая записи в реестре.

Код программы установки я упрощу, так как она может быть иной у вас, в том числе дизайн. Суть ее сводится к тому что вы помещаете байт код вашей программы, в программу установки, альтернативным вариантом может быть еще и скачивание вашей программы с сервера. Как считать вашу программу или скачивать файлы вы можете посмотреть в интернете, иначе статья будет очень большой.

По этому я упрощу этот процесс, и помещу уже самостоятельно нашу программу в папку, у вас же это должен сделать установщик.

Предварительные установки.

Создадим папку на диске C:\My_prog в которую поместим два файла, нашу программу MyProg.exe и программу которая будет удалять все файлы и запись из реестра, назовем ее UninstallMyProg об удалении и коде внутри программы мы поговорим позже. Так же в эту папку мы можем добавить иконку нашей софтины, но я покажу как можно выдернуть ее из нашей программы.

Install

Теперь я покажу часть реализации программы установщика который будет отвечать только за записи в реестр, тем самым добавлять вашу программу в Установка и удаление программ.

  class Program
        {
            static void Main(string[] args)
            {
                string progName = "MyProg";
                string progDir = @"C:\My_Prog";
                string progIcon = @"C:\My_Prog\MyProg.exe, -105";   //Если у вас своя иконка указываем ее имя MyIco.ico";
                string progDeleteString = @"C:\My_Prog\UninstallMyProg.exe";

                AddProgramToControlPanel(progName, progDir, progIcon, progDeleteString);

                Console.ReadLine();
            }

            public static void AddProgramToControlPanel(string progName, string progDir, string progIcon, string progDeleteString)
            {
                try
                {
                    // Определяем ветку реестра, в которую будем вносить изменения
                    string registryLocation = @"Software\Microsoft\Windows\CurrentVersion\Uninstall";
                    // Открываем указанный подраздел в разделе реестра HKEY_LOCAL_MACHINE для записи
                    RegistryKey regKey = (Registry.LocalMachine).OpenSubKey(registryLocation, true);
                    // Создаём новый вложенный раздел с информацией по нашей программе
                    RegistryKey progKey = regKey.CreateSubKey(progName);
                    // Отображаемое имя
                    progKey.SetValue("DisplayName", progName, RegistryValueKind.String);
                    // Папка с файлами
                    progKey.SetValue("InstallLocation", progDir, RegistryValueKind.ExpandString);
                    // Иконка
                    progKey.SetValue("DisplayIcon", progIcon, RegistryValueKind.String);
                    // Строка удаления
                    progKey.SetValue("UninstallString", progDeleteString, RegistryValueKind.ExpandString);
                    // Отображаемая версия
                    progKey.SetValue("DisplayVersion", "1.0.0.0", RegistryValueKind.String);
                    // Издатель
                    progKey.SetValue("Publisher", "Microsoft", RegistryValueKind.String);
                    Console.WriteLine("Программа была успешно добавлена в Установка и удаление программ!");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Во время добавления программы произошла ошибка! Ошибка: {0}", ex.Message);
                }
            }
        }

 

После запуска кода программы у нас должна появится запись в реестре, стоит отметить что запуск установки и удаления нужно производить с правами администратора.

Вот так у меня выглядит MyProg в Установке и удалении программы.

Uninstall

Теперь рассмотрим реализацию UninstallMyProg которая будет запускаться из Установки и удаления программ.

class Program
        {
            static void Main(string[] args)
            {
                DeleteProgramFromControlPanel("MyProg");
                Console.ReadLine();
            }

            public static void DeleteProgramFromControlPanel(string progName)
            {
                string registryLocation = @"Software\Microsoft\Windows\CurrentVersion\Uninstall";
                RegistryKey regKey = (Registry.LocalMachine).OpenSubKey(registryLocation, true);
                RegistryKey progKey = regKey.OpenSubKey(progName);
                // Если у нас такая ветка реестра есть
                if (progKey != null)
                {
                    // Удаляем данные о программе
                    regKey.DeleteSubKey(progName);
                    Console.WriteLine("Программа была успешно удалена из Установка и удаление программ!");
                    // Тут необходимо реализовать собственную реализацию удаления программы. 
                }
            }
        }

 

Пишем скрипт для удаления файла Unistall

Таким образом у нас произойдет удаление всех записей о нашей программе в реестре, так же вам надо будет реализовать удаление файла программы. Еще одной проблемой остается удаление собственной папки и файла программы UninstallMyProg. Думаю многие встречали что иногда после удаления программ они не все файлы удаляют и часть из них остаются. Дело в том что когда программа UninstallMyProg запущена она не может удалить сама себя. Но мы используем скрипт который нам в этом поможет. Напишем метод и добавим его вызов в нашу программу UninstallMyProg в ту сточку кода где будет происходить удаление файлов программ.

 static void  Terminate() //удаляем и саму программу
        {
            string Body = "Set fso = CreateObject(\"Scripting.FileSystemObject\"): On error resume next: Dim I: I = 0" + Environment.NewLine + "Set File = FSO.GetFile(\"" + Application.ExecutablePath + "\"): Do while I = 0: fso.DeleteFile (\"" + Application.ExecutablePath + "\"): fso.DeleteFile (\"" + Environment.CurrentDirectory + "\\1.vbs\"): " + Environment.NewLine + "If FSO.FileExists(File) = false Then: I = 1: End If: Loop";
            System.IO.File.WriteAllText(Environment.CurrentDirectory + "\\1.vbs", Body, System.Text.Encoding.Default);
            System.Diagnostics.Process.Start(Environment.CurrentDirectory + "\\1.vbs");
        }

Сам код можно не менять, суть его сводится к тому что создается временный скрипт, который запуститься после завершения и закрытия программы UninstallMyProg. В параметры скрипта будет передано имя нашей программы UninstallMyProg  после закрытия он ее удалит. Вам лишь останется добавить удаления вашей папки в этот скрипт. 

На этом все! Таким образом мы смогли написать свой собственный install установщик программы и uninstall и деинсталлятор программы, внести изменения в реестр, добавить нашу программу в Установка и удаления программ.

Обновлено: 21.02.2021 — 09:30

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.