как выгрузить управляемую c dll?

#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

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