强制进程在com对象被销毁时关闭

时间:2013-11-15 01:56:08

标签: vb.net com com-interop

真的不确定我能做些什么,但希望有人可以提供帮助

基本上我开发了一个通过com接口与桌面会计系统交换信息的系统

我所做的是将com库的项目引用添加到我的.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,但无法真正了解如何获得所需的方法等

我怀疑如果会计软件存在内部垃圾收集的问题。我已多次与他们谈过此事,但他们不愿意对此采取任何行动。

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

以下是您要寻找的内容:

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

您还必须确保没有需要销毁的子COM个对象 - 如果是这样,则以相反的顺序销毁它们。