Как вы можете получить DLL для удаления при выходе из процесса его владельца? - PullRequest
2 голосов
/ 11 марта 2010

У меня есть сборка .NET DLL, которая создается на лету из предварительно скомпилированного кода в базе данных. Есть ли способ создать файл DLL, поместить в него данные, загрузить его с классом Assembly, а затем, когда процесс завершится, удалить эту DLL?

Моими первыми мыслями было открыть его с флагом FILE_SHARE_DELETE, загрузить его с Assembly.LoadFrom, и автоматически удалить его.

Хотя LoadLibrary открывает файлы с флагом FILE_SHARE_DELETE, когда DLL все еще отображается в памяти, ОС не удалит файл.

Итак, как можно удалить DLL, когда процесс завершается без использования AppDomains или запуска внешних исполняемых файлов «Удалить этот файл после выхода целевого процесса» (библиотеки DLL .NET, которые загружаются во время выполнения, зависят от ввода пользователя, поэтому было бы связано с каким-то процессом взаимодействия, которого я хотел бы избежать).

Ответы [ 2 ]

0 голосов
/ 11 марта 2010

Нет, это не может работать. CLR создает представление файла с отображением в памяти в DLL, его нельзя удалить, пока это представление не будет уничтожено. Что не произойдет, пока AppDomain не будет выгружен. Поскольку вы, вероятно, загружаете его в основной AD, этого не произойдет, пока программа не прекратит работу.

Вспомогательный процесс, который запускает ваш основной и удаляет DLL после его остановки, - это все, о чем я могу подумать, если вы не хотите использовать AD.

0 голосов
/ 11 марта 2010

Если вы отслеживаете место сборки и сохранения сборки, вы можете просто использовать File.Delete в расположении (расположенном в System.IO)

...