Есть несколько причин, по которым ваш exe-файл все еще может быть заблокирован, когда он завершит выполнение. некоторые из них связаны с вашим кодом, а некоторые - с системой. Вот две основные причины, по которым я могу подумать над вашим кодом:
Как вы закрываете файловый поток при копировании exe-файла во временную папку, если он явно не выпущен, время выпуска может время от времени меняться.
второе - даже если процесс завершен, выполнение не означает, что он выполнен в системной перспективе.
Первый может быть исключен, второй можно отслеживать в списке процессов, НО у вас все еще есть мешок возможных блокировок (ваша программа выполняется дважды параллельно, кто-то проверяет на вирусы ручную очистку временной папки, мастер очистки диска). Поэтому я бы предложил либо переработать логику программы. Если исполняемый файл написан на c #, загрузите двоичный файл и запустите программу вместо копирования файла.
Если вам по какой-то причине нужно копировать файл каждый раз, когда он выполняется, создайте поток очистки с низким приоритетом. дайте ему попытаться очистить после вызова WaitForExit, если это не удастся, повторите попытку через x миллисекунд, если это снова не удастся, попробуйте после 2x и т. д.
При этом я предполагаю, что это будут (вероятно, неуправляемые) вызовы API для поиска блокировок файлов на системном уровне. Лично я хотел бы, чтобы система сама это выяснила, хотя