#c #visual-c #c -cli #managed-c
#c #visual-c #c -cli #управляемый-c
Вопрос:
A.dll является родной библиотекой dll c , B.dll это управляемая библиотека DLL на языке c . A.dll зависит от B.dll , поэтому при загрузке A.dll , B.dll загружается автоматически, но после A.dll выгружается, B.dll все еще загружен. Только A.dll зависит от B.dll , почему B.dll не может быть выгружен? Как выгрузить управляемую c dll? Я использую vs2010.
Спасибо
Комментарии:
1. Я использую ::FreeLibrary API для выгрузки управляемой C dll очевидно, ее можно выгрузить, есть ли какой-либо риск?
Ответ №1:
Вы не можете выгрузить управляемую сборку после ее загрузки CLR. Единственный способ — уничтожить AppDomain.
Комментарии:
1. Дарин Димитров прав. Чтобы выгрузить сборку, вам необходимо создать отдельный AppDomain, который будет отвечать за разделение с AppDomain, содержащим точку входа в ваше приложение (обычно exe-файл). Для большего эти AppDomain-ы должны обмениваться только строковыми или значениями, поскольку иначе ваша сборка B в конечном итоге загружается в оба ваших AppDomain-ов и, таким образом, не позволяет выгружать B.
Ответ №2:
Используя обычные официально известные подходы, это невозможно без выгрузки AppDomain
— по крайней мере, для .net 4.8 framework.
Теоретически можно загрузить управляемую .dll, как и в ОЗУ, см. Следующий прототип:
https://github.com/tapika/dllloader
Но даже при этом его можно освободить с родной стороны — скорее всего, это вызовет некоторую головную боль у управляемой стороны.