Разгрузите DLL, загруженный с помощью DllImport

Как я разгружаю DLL, который был загружен с помощью DllImport в C#?

31
задан g t 23 January 2012 в 16:31
поделиться

1 ответ

Самый надежный способ выгрузить неуправляемую DLL из процесса, который был загружен с помощью объявления pinvoke [DllImport], - это загрузить ее самостоятельно, опять же, путем вызова LoadLibrary (). Это дает вам надежный дескриптор DLL и работает правильно, даже если имя модуля DLL неоднозначно. Это не оказывает никакого влияния во время выполнения, кроме того, что загрузчик Windows увеличивает счетчик внутренних ссылок на DLL с 1 до 2.

Затем вы можете дважды pinvoke FreeLibrary () , чтобы уменьшить счетчик ссылок. в 0, передав ему IntPtr, полученный от LoadLibrary (). Это выгружает DLL, а также все загруженные зависимые DLL.

Помните, что вы получите очень неприятный сбой, когда попытаетесь повторно активировать любую экспортированную функцию в DLL, в любое время после этого. Маршаллер pinvoke не знает, что DLL больше нет, и будет вызывать функцию по адресу, который, по его мнению, все еще действителен. Который засыпает вашу программу исключением AccessViolation, если вам повезет. Или запускает совершенно случайный фрагмент кода, если вам не повезло, и адресное пространство, которое раньше занимала DLL, было повторно использовано другой DLL. Тогда может случиться все, что угодно, ничего хорошего.

23
ответ дан 27 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: