2013-11-15 1 views
0

На самом деле не уверен, что я могу сделать с этим, но в надежде, что кто-то может быть в состоянии помочьпроцесс Принудительно закрыть, когда объект ком уничтожен

В основном я разработал систему, которая обменивается информацией с системой учета рабочего стола через интерфейс ком

Что я сделал это добавил ссылку на проект для библиотеки ком моя .net проекта, то в моем коде я создаю новый экземпляр

Dim myObject as New AccountingLibraryType 

затем это позволяет мне доступ к видимому свойства, процедуры и функции и т. д., например

myObject.Login("Login details go here") 

Эта часть все работает отлично

Моя проблема начинается, когда я закончу работать с экземпляром моего объекта. Независимо от того, что я делаю, я часто не в конечном итоге процесс все еще работает

Когда я отбрасывая мой объект я следующий

myObject.Logout 'As per Accounting software developers, should close process 
GC.Collect() 
Marshel.ReleaseComObject(myObject) ' Also tried Marshal.FinalReleaseComObject(myObject) 
myObject = Nothing 

Даже после всего этого процесса еще осталось работать в моей менеджер задач.

Я исследовал процесс получения ProgID, но, к сожалению, конечные пользователи обычно работают непосредственно в бухгалтерском программном обеспечении, я не могу гарантировать, что я получу правильный процесс.

Насколько я вижу, на объекте com нет ничего доступного для идентификации процесса для него. я нашел, что я могу получить атрибут коллекции, но опять-таки не понимаю, в любом случае, чтобы получить от этого к правильному процессу

Dim attributes As AttributeCollection 
attributes = TypeDescriptor.GetAttributes(GetType(AccountingLibraryType)) 

Так во-первых, что-нибудь еще, что я мог делать, чтобы обеспечить процесс полностью закрыто, когда я закончил с ним

Во-вторых, есть ли лучший способ создать экземпляр объекта, где я могу получить какую-то форму дескриптора процесса, но все же имею доступ к видимым свойствам и методам. Я посмотрел Process и StartInfo, но не мог понять, как добраться до нужных методов и т. Д.

Я подозреваю, что есть проблема с внутренней сборкой мусора, если бухгалтерское программное обеспечение. Я говорил с ними несколько раз об этом, но они не хотят ничего с этим поделать.

Цените помощь

+0

Должно сказать, что я написал собственный класс-оболочку для этого, который реализует IDisposable. В Sub Dispose есть место, где я очищаю ссылки на объекты. – Hursey

ответ

0

Вот что ищет:

Marshal.FinalReleaseComObject(myObject) 
myObject = Nothing 
GC.Collect() 
GC.WaitForPendingFinalizers() 
GC.Collect() 

Вы также должны убедиться, что нет ребенка COM объектов, которые должны быть уничтожено - если так уничтожить их в обратный порядок.

+0

Спасибо за супер быстрый ответ Дон. Изменен мой код очистки в соответствии с вашими инструкциями, без изменений. – Hursey

+0

Любой очевидный способ идентифицировать дочерние объекты com? – Hursey

+0

Найденный вами, вы точно точно с дочерними объектами.Есть функция, с которой я передаю запрос sql, и возвращает набор данных в виде ком-объекта – Hursey