Что происходит в «чистилище собрания»?
-
19-09-2019 - |
Вопрос
Когда сборка .NET развертывается в GAC и целевой файл блокируется, Windows удерживает ее в, как я могу предположить, своего рода «чистилище сборок» — c:\windows\assembly\temp
.
Используя Process Explorer, их можно легко увидеть при поиске подозрительной DLL:
(источник: alexangas.com)
Как только я завершаю процесс блокировки файла (в данном случае OWSTIMER.EXE), он волшебным образом правильно развертывается в GAC.
Мне любопытно, что на самом деле здесь делает Windows.Как он узнает, что блокировка файла снята?Где он хранит записи заблокированных файлов?Оно когда-нибудь сдается?
Решение
Temp
и tmp
— это временные папки, используемые во время установки и удаления сборки GAC. Tmp
используется для установки и Temp
используется для удаления.Источник: Температура GAC и Tmp
Служба оптимизации среды выполнения .NET (mscorsvw.exe
), вероятно, время от времени проверяет файлы, чтобы проверить, закрыты ли они, чтобы можно было [удалить] установить ожидающие сборки.
Возможно, я ошибаюсь, но, насколько мне известно, не существует WinAPI, который бы уведомлял вас о закрытии/разблокировке определенного файла.Вы должны следить за ними самостоятельно.Но сама Windows должна иметь такой список где-то в памяти (по крайней мере, у нее есть список открытых дескрипторов), поэтому она просто знает, что файл закрыт, потому что дескриптор, представляющий файл, освобождается.