Это сложно без введения еще одного процесса (который вы затем захотите удалить, без сомнения). В вашем случае у вас уже есть 2 процесса - updater.exe и application.exe. Вероятно, я бы просто использовал приложение delete updater.exe, когда оно оттуда появилось - вы можете использовать простой аргумент командной строки или вызов IPC от updater.exe до application.exe для его запуска. Это не совсем самораспаковывающийся EXE-файл, но он отвечает требованиям, которые я считаю.
Для полной обработки и других опций вы должны прочитать окончательная обработка самоуничтожающихся EXE-файлов . Примеры кода находятся в C (или ASM), но должны быть p / invokable.
Я бы, наверное, попробовал CreateFile с FILE_FLAG_DELETE_ON_CLOSE
для updater.exe с чем-то вроде (psuedo code):
var h = CreateFile(
"updater.exe",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_DELETE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE
);
byte[] updaterBytes = GetUpdaterBytesFromWeb();
File.WriteAllBytes("updater.exe", updaterBytes);
Process.Start("updater.exe");
После выхода из application.exe, updater.exe имеет дескриптор файла 1. При выходе из Updater.exe он падает до 0 и должен быть удален.