Всем привет! Думаю многих из вас интересовало как же происходит установка чужих программ, как они помещают свои программы в параметры Windows для установки и удаления программ? Напишем собственный установщик программы и Uninstall. Скажу сразу, да есть обертки которые все это позволяют автоматизировать, так же имеется встроенный инсталлятор в самой VS. Однако, когда вам не обходимо вызвать некие методы для проверки или докачки файлов, копирования, или не стандартное поведения вашего ПО. Вам придется писать свой инсталлятор.
Суть проблемы и ее решения.
Сейчас рассмотрим то как можно добавить в Установка и удаление программ, добавить собственную программу и удалить через нее. В примере будет использоваться символичное название нашей программы MyProg.exe
По факту вам надо написать три программы, первая из них это Установщик, сама программа, и программа удаления всех частей программы включая записи в реестре.
Код программы установки я упрощу, так как она может быть иной у вас, в том числе дизайн. Суть ее сводится к тому что вы помещаете байт код вашей программы, в программу установки, альтернативным вариантом может быть еще и скачивание вашей программы с сервера. Как считать вашу программу или скачивать файлы вы можете посмотреть в интернете, иначе статья будет очень большой.
По этому я упрощу этот процесс, и помещу уже самостоятельно нашу программу в папку, у вас же это должен сделать установщик.
Предварительные установки.
Создадим папку на диске C:\My_prog в которую поместим два файла, нашу программу MyProg.exe и программу которая будет удалять все файлы и запись из реестра, назовем ее UninstallMyProg об удалении и коде внутри программы мы поговорим позже. Так же в эту папку мы можем добавить иконку нашей софтины, но я покажу как можно выдернуть ее из нашей программы.
Install
Теперь я покажу часть реализации программы установщика который будет отвечать только за записи в реестр, тем самым добавлять вашу программу в Установка и удаление программ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
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 которая будет запускаться из Установки и удаления программ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 в ту сточку кода где будет происходить удаление файлов программ.
1 2 3 4 5 6 |
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 и деинсталлятор программы, внести изменения в реестр, добавить нашу программу в Установка и удаления программ.