Вопрос

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

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

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

Нет правильного решения

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top