Выгрузить COM dll из программы .Net - PullRequest
2 голосов
/ 25 декабря 2008

У нас есть приложение .Net, из которого создается экземпляр C ++ COM-компонента. Мы загружаем компонент COM из окна дочерней формы. Существует общий ресурс, который редактируется приложением .Net, и inturn используется для запуска COM dll.

Когда выполняется следующая последовательность шагов:
1. Создание экземпляра COM-компонента в новом дочернем окне. Компонент COM создается и используется дочерней формой, а после использования ему присваивается значение NULL, в надежде, что компонент COM будет выгружен.
2. Оставьте дочернее окно открытым, а затем отредактируйте ресурс
3. Теперь перейдите и «обновите» форму, чтобы создать новый экземпляр COM, чтобы увидеть ссылку на измененный ресурс, но ресурс не обновляется.

Мы также использовали метод Marshal.ReleaseComObject, но безуспешно. Пожалуйста посоветуй.

Ответы [ 3 ]

4 голосов
/ 25 декабря 2008

После загрузки библиотеки DLL в домен .Net App невозможно принудительно выгружать библиотеку DLL. Это досадное ограничение CLR. Если вам абсолютно необходима библиотека DLL для выгрузки, вы можете сделать следующее.

  1. Создать новый домен приложений
  2. Загрузите DLL в новую DLL
  3. Работай в новом домене приложений
  4. Выгрузите новый домен приложений

Если DLL-библиотека загружается только в один домен приложений, выгрузка домена приложений также приведет к ее выгрузке. Таким образом, это позволит выгружать DLL. Однако это довольно тяжелый ответ.

0 голосов
/ 05 июня 2012

A обсуждение на странице clrInterop очень близко описывает то, что вы изложили в своем вопросе. Сборщик мусора не выгружает родную dll. Я цитирую: «Это может быть очень опасно для clr, поскольку это может быть другой код (даже нативный код), который зависит от этой библиотеки DLL. Если вы уверены, что библиотека DLL больше не используется, вызов Windows API, такой как FreeLibrary, может Проще всего выгрузить dll. "

Так что вам нужно будет взаимодействовать с FreeLibrary и использовать его для выгрузки родной библиотеки DLL. Хотя я мог бы добавить: нет, если вы можете попытаться найти решение, где вам не нужно выгружать DLL.

0 голосов
/ 25 декабря 2008

COM-объект и DLL - две разные вещи, даже если одна находится в другой. Некоторые хаки возможны, но гораздо лучшее решение - переписать эту часть более разумным способом, который не зависит от выгрузки DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...