Создаём класс GlobalPaths.cs - В котором раним пути (можно и без него, просто так удобно) namespace SelfDeleteEx { using System; using System.IO; using System.Reflection; public static class GlobalPaths { public static string CurrDir => Environment.CurrentDirectory; public static string AssemblyPath => Assembly.GetExecutingAssembly().Location; public static string StartupPath => Path.GetDirectoryName(AssemblyPath); public static string GetFileName => Path.GetFileName(AppDomain.CurrentDomain.FriendlyName); public static string AppData => Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); public static string SelfHelper => Path.Combine(AppData, "Self.bat"); } } Код namespace SelfDeleteEx { using System; using System.IO; using System.Reflection; public static class GlobalPaths { public static string CurrDir => Environment.CurrentDirectory; public static string AssemblyPath => Assembly.GetExecutingAssembly().Location; public static string StartupPath => Path.GetDirectoryName(AssemblyPath); public static string GetFileName => Path.GetFileName(AppDomain.CurrentDomain.FriendlyName); public static string AppData => Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); public static string SelfHelper => Path.Combine(AppData, "Self.bat"); } } В классе SelfEx.cs - Наши функции по само удалению namespace SelfDeleteEx { using System; using System.Diagnostics; using System.IO; // Разработал: r3xq1 public static class SelfEx { public static void CmdInit(string args, string commands) { try { var info = new ProcessStartInfo { FileName = commands, Arguments = args, WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true }; using var process = new Process { StartInfo = info }; process?.Start(); process.Refresh(); } catch { } } public static void BatInit(string pathFile, string localpath) { if (!string.IsNullOrWhiteSpace(pathFile) && pathFile.EndsWith(".bat", StringComparison.InvariantCultureIgnoreCase)) { try { using var sw = new StreamWriter(pathFile, false); // sw.WriteLine($"@echo off\r\nchcp 1251 >NUL\r\ncls\r\n:loop\r\ndel \"{localpath}\"if Exist \"{localpath}\" GOTO loop del %0"); sw.WriteLine("chcp 1251 >NUL"); sw.WriteLine("cls"); sw.WriteLine(":loop"); sw.WriteLine($"del \"{localpath}\""); sw.WriteLine($"if Exist \"{localpath}\" GOTO loop"); sw.WriteLine("del %0"); sw.Flush(); } catch { } try { var info = new ProcessStartInfo { FileName = pathFile, WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true }; using var process = new Process { StartInfo = info }; process?.Start(); process.Refresh(); } catch { } } CmdInit($"/C choice /C Y /N /D Y /T 0 &Del {GlobalPaths.AssemblyPath}", "cmd.exe"); } } } Код namespace SelfDeleteEx { using System; using System.Diagnostics; using System.IO; // Разработал: r3xq1 public static class SelfEx { public static void CmdInit(string args, string commands) { try { var info = new ProcessStartInfo { FileName = commands, Arguments = args, WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true }; using var process = new Process { StartInfo = info }; process?.Start(); process.Refresh(); } catch { } } public static void BatInit(string pathFile, string localpath) { if (!string.IsNullOrWhiteSpace(pathFile) && pathFile.EndsWith(".bat", StringComparison.InvariantCultureIgnoreCase)) { try { using var sw = new StreamWriter(pathFile, false); // sw.WriteLine($"@echo off\r\nchcp 1251 >NUL\r\ncls\r\n:loop\r\ndel \"{localpath}\"if Exist \"{localpath}\" GOTO loop del %0"); sw.WriteLine("chcp 1251 >NUL"); sw.WriteLine("cls"); sw.WriteLine(":loop"); sw.WriteLine($"del \"{localpath}\""); sw.WriteLine($"if Exist \"{localpath}\" GOTO loop"); sw.WriteLine("del %0"); sw.Flush(); } catch { } try { var info = new ProcessStartInfo { FileName = pathFile, WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true }; using var process = new Process { StartInfo = info }; process?.Start(); process.Refresh(); } catch { } } CmdInit($"/C choice /C Y /N /D Y /T 0 &Del {GlobalPaths.AssemblyPath}", "cmd.exe"); } } } Вызов: namespace SelfDeleteEx { using System; internal static class Program { [STAThread] public static void Main() { Console.Title = "SelfDeleteEx by r3xq1"; Console.WriteLine("Нажмите любую кнопку для закрытия и само удаление программы"); Console.ReadLine(); SelfEx.CmdInit($"/C choice /C Y /N /D Y /T 0 &Del {GlobalPaths.AssemblyPath}", "cmd.exe"); SelfEx.BatInit(GlobalPaths.SelfHelper, GlobalPaths.AssemblyPath); } } } Код namespace SelfDeleteEx { using System; internal static class Program { [STAThread] public static void Main() { Console.Title = "SelfDeleteEx by r3xq1"; Console.WriteLine("Нажмите любую кнопку для закрытия и само удаление программы"); Console.ReadLine(); SelfEx.CmdInit($"/C choice /C Y /N /D Y /T 0 &Del {GlobalPaths.AssemblyPath}", "cmd.exe"); SelfEx.BatInit(GlobalPaths.SelfHelper, GlobalPaths.AssemblyPath); } } } Первый метод удаляет файл через командную строку по определённому времени ( 0 - это мгновенное ) SelfEx.CmdInit($"/C choice /C Y /N /D Y /T 0 &Del {GlobalPaths.AssemblyPath}", "cmd.exe"); Код SelfEx.CmdInit($"/C choice /C Y /N /D Y /T 0 &Del {GlobalPaths.AssemblyPath}", "cmd.exe"); Второй метод удаляет файл через батник, .bat файл спрятан в %AppData% от лишних глаз. SelfEx.BatInit(SelfHelper, AssemblyPath); Код SelfEx.BatInit(SelfHelper, AssemblyPath);