Как я могу освободить DLL, на которую ссылается исполняемый файл, который не работает? - PullRequest
1 голос
/ 25 сентября 2010

У меня есть служба Windows, которая использует DLL. Независимо от того, работает служба или нет, ее исполняемый файл хранит дескриптор этой библиотеки DLL, что не позволяет мне автоматически обновлять ее.

Почему, и как я могу удалить этот дескриптор программно (желательно через .Net)?

Обновление: Я знаю, что исполняемый файл службы имеет дескриптор, потому что я запустил handle.exe на dll, и только exe службы подошел. Ничто не может сорваться, когда я запустил его на exe, и я знаю, что служба не работает, потому что я проверил список служб. Нет ничего, что могло бы использовать dll, о котором я могу думать.

Ответы [ 5 ]

2 голосов
/ 25 сентября 2010

DLL была загружена и отображена в виртуальную память.Это ставит блокировку на файл.Запуск или остановка службы не меняет этого.Точно то же самое верно для службы EXE.

Вы должны были бы динамически загружать и выгружать DLL, чтобы это исправить.LoadLibrary и FreeLibrary.Но это работает, только если это неуправляемая DLL.И это очень рискованно, если вы используете pinvoke, потому что CLR не будет автоматически загружать DLL снова после ее выгрузки.

Если это управляемая DLL, вы можете выгрузить ее, только если она была загружена в другой домен приложения.Ложе из роз тоже.

2 голосов
/ 25 сентября 2010

Это невозможно.Дескриптор файла может иметь только запущенный процесс.

Вы можете использовать Process Explorer , чтобы узнать, какой процесс имеет дескриптор открытой DLL:* Запустите Process Explorer

Нажмите Ctrl + F и найдите имя DLL Подождите, пока поиск завершится Вы увидите, какие процессы имеют открытый дескрипторв DLL.
1 голос
/ 25 сентября 2010

Это была неприятная маленькая проблема.Служба имеет два потока, и один из них выполняет очень тонкую, не часто нужную функцию, и я не заметил, что она зашла в тупик через общий ресурс.Так что это зависало, на неопределенный срок, что и поддерживало мой исполняемый файл, несмотря на то, что служба была закрыта.Исправление этой проблемы решило мою проблему с дескриптором файла.

Спасибо за предложения, все.

1 голос
/ 25 сентября 2010

Нет способа, чтобы EXE-файл перетянул дескриптор в DLL из другого процесса.Это почти наверняка имеет дескриптор, потому что DLL активно используется процессом.Единственная доступная опция на самом деле - убить процесс EXE из сервиса.Это можно сделать с помощью метода Process.Kill.

Хотя убийство других процессов, которыми вы не владеете, обычно говорит о плохом поведении в мире программирования.Почему ваша программа лучше их?

0 голосов
/ 26 сентября 2010

Я всегда сталкиваюсь с такими проблемами, когда люди создают длительно работающий процесс обслуживания Windows, а затем тратят большое время на решение проблем, которые он создает.

Если возможно, можете ли вы подумать об использовании планировщика задач Windows для этого?Вы видите здесь, почему .. http://pavangayakwad.blogspot.com/2010/09/windows-service-or-windows-task.html

...