【问题标题】:Force process to close when com object is destroyed当 com 对象被销毁时强制进程关闭
【发布时间】:2013-11-28 07:36:45
【问题描述】:

真的不知道我能用这个做什么,但希望有人能提供帮助

基本上我已经开发了一个系统,通过 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,但无法真正了解如何使用所需的方法等

我怀疑会计软件的内部垃圾收集存在一些问题。我已经和他们谈过很多次了,但他们不愿意做任何事情。

感谢任何帮助

【问题讨论】:

  • 应该说,我已经为此编写了自己的包装类,它实现了 IDisposable。在 Sub Dispose 中,我正在清理我的对象引用。

标签: vb.net com com-interop


【解决方案1】:

这就是你要找的东西:

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

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

【讨论】:

  • 感谢唐的超级快速回复。根据您的说明更改了我的清理代码,没有更改。
  • 有什么明显的方法可以识别子 com 对象吗?
  • 找到它,你在哪里与子对象完全正确。有一个函数,我将 sql 查询传递给它,它以 com 对象的形式返回一个数据集
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2016-02-15
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多