Я использую сторонний COM-компонент посредством сборки взаимодействия .NET в IronPython, как показано здесь: Как я могу использовать 'ссылку' VB6 COM в IronPython?
Мой опыт в этой области был замечательным, я очень впечатлен количеством материала, который работает без проблем ... кроме одной вещи.
Сторонний COM-компонент использует библиотеку Microsoft DAO (не знаю, какая версия) для работы с базой данных, созданной еще одним сторонним приложением. Проблема в том, что этот файл базы данных воссоздается во время выполнения моей программы, и я хотел бы «деинициализировать» этот COM-объект. В частности, выполнение моего кода (который обращается к атрибутам компонента COM, вызывает его методы и т. Д.) Работает нормально при первом запуске процедуры. Однако в следующий раз сторонний COM-компонент отобразит окно с сообщением о том, что база данных (файл MSAccess 95 .mdb) уже используется, и предлагает возможность повторить попытку. Повторное нажатие работает надежно, поэтому основной проблемой является появление этого диалогового окна.
Итак, моя теория состоит в том, что COM-компонент передает дескрипторы в БД, и я не могу найти метод очистки для вызова. Я пробовал .Dispose()
, но это не сработало.
Мое последнее средство - сделать код, который вызывает COM-объект, отдельным процессом IronPython, который взаимодействует с моим основным процессом через ввод / вывод std, поскольку роль, которую выполняет COM-объект, скорее «дает мне всю эту информацию прямо сейчас». 'вариант использования вместо постоянно требуемой зависимости.
Я надеюсь избежать этого сценария, и, поскольку я не знаком с COM (или, на самом деле, .NET), я могу только надеяться, что мне не хватает очевидного .Dispose
метода или тому подобного.
Если нет чистого способа, могу ли я принудительно выгрузить сборку из моего процесса, аналогично повторным вызовам FreeLibrary
в собственном коде? (Я гарантирую, что мой код больше не будет использовать объект, поэтому мне не нужно беспокоиться об отсутствии ссылок с моей стороны, приводящих к ошибке защиты памяти)
EDIT:
Мне не удалось решить эту проблему, поэтому я вышел из процесса и позволил очистить окна, когда мой дочерний пакетный процесс завершился.