Самый надежный способ выгрузить неуправляемую DLL из процесса, который был загружен объявлением pinvoke [DllImport], - это загрузить его самостоятельно, снова вызвав LoadLibrary (). Это дает вам надежный дескриптор DLL и работает правильно, даже если имя модуля DLL неоднозначно. Он не оказывает никакого влияния во время выполнения, кроме загрузчика Windows, увеличивая внутренний счетчик ссылок на DLL с 1 до 2.
Затем вы можете вызвать функцию FreeLibrary () дважды , чтобы уменьшить счетчик ссылок до 0, передав ему IntPtr, полученный из LoadLibrary (). Это выгружает DLL, а также любые зависимые DLL, которые были загружены.
Остерегайтесь, что вы получите очень неприятный сбой при попытке снова вызвать любую экспортированную функцию в DLL, любой раз после этого. Маршаллер pinvoke не знает, что DLL больше не существует, и будет вызывать функцию по адресу, который, по ее мнению, все еще действителен. Который бомбит вашу программу с исключением AccessViolation, если вам повезет. Или запускает совершенно случайный бит кода, если вам не так повезло, и адресное пространство, ранее занимаемое DLL, снова использовалось другой DLL. Тогда может случиться что угодно, ничего хорошего.