Как вы можете получить DLL для удаления при выходе из процесса его владельца?
У меня есть сборка.NET DLL, которая создается на лету из предварительно скомпилированного кода в базе данных. Есть ли способ создать файл DLL, положить в него данные, загрузить его с Assembly
класс, то когда процесс завершится, эта DLL будет удалена?
Мои первые мысли были открыть его с FILE_SHARE_DELETE
флаг, загрузить его Assembly.LoadFrom,
и он будет автоматически удален.
Хотя LoadLibrary открывает файлы с FILE_SHARE_DELETE
флаг, когда DLL все еще отображается в памяти, ОС не удалит файл.
Итак, как можно удалить DLL, когда процесс завершается без использования AppDomains
или запуск внешнего "удаления этого файла после выхода целевого процесса" исполняемых файлов (библиотеки DLL.NET, которые загружаются во время выполнения, зависят от пользовательского ввода, поэтому для этого потребовалось бы какое-то взаимодействие с процессом, которого я хотел бы избежать).
2 ответа
Нет, это не может работать. CLR создает представление файла с отображением в памяти в DLL, его нельзя удалить, пока это представление не будет уничтожено. Что не произойдет, пока AppDomain не будет выгружен. Поскольку вы, вероятно, загружаете его в основной AD, этого не произойдет, пока программа не прекратит работу.
Вспомогательный процесс, который запускает ваш основной и удаляет библиотеку DLL после ее остановки, - это все, о чем я могу подумать, если вы не хотите использовать AD.
Если вы отслеживаете, где сборка компилируется и сохраняется, вы можете просто использовать File.Delete
на месте (находится в System.IO)