【发布时间】: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