Как избавиться от COM-объекта VB6, который я использую, через сборку взаимодействия из IronPython? - PullRequest
1 голос
/ 31 августа 2009

Я использую сторонний 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:

Мне не удалось решить эту проблему, поэтому я вышел из процесса и позволил очистить окна, когда мой дочерний пакетный процесс завершился.

1 Ответ

1 голос
/ 31 августа 2009

Не уверен насчет IronPython, но при работе с COM в C # вам необходимо вызвать Marshal.ReleaseComObject после использования, чтобы убедиться, что счетчик ссылок правильно уменьшен.

В противном случае вы потеряете ... Dispose () не сделает этого за вас.

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx

...