2010-03-11 3 views
2

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

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

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

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

ответ

0

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

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

0

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