从C#中杀死一个进程外的COM对象

时间:2009-03-16 15:03:41

标签: c# com

我有一个进程外的COM对象,我们使用dllhost从C#调用(我们无法使用COM +)。这很好用,我有自己的对象池,我可以随时使用。 COM对象将重复使用多次并且长时间运行(有时> 20分钟)。不幸的是,这是一个偶尔会挂起的旧VB ActiveX DLL。所以,我需要能够杀死它。我已经尝试显式释放COM对象,然后从另一个线程收集垃圾,但这没有任何作用。有没有人有任何想法,除了抓住dllhost的PID并杀死它时,我旋转它(可能不那么安全)?谢谢你的帮助。

我试过

System.Runtime.InteropServices.Marshal.ReleaseComObject(m_MyObj);
GC.Collect();
GC.WaitForPendingFinalizers();
m_MyObj = null;

我通过

创建它
 uint hResult = Ole32Methods.CoCreateInstance(ref CalcServerGuid, null, (uint)CLSCTX.CLSCTX_LOCAL_SERVER, ref IID_IUnknown,
            out CalcServerInstance);

1 个答案:

答案 0 :(得分:0)

如果我了解你正在运行VB6 COM对象而你在dllhost中说。这对我来说意味着这是在COM +下运行的已配置组件。如果这是一个服务器应用程序,您可以使用COM +管理目录关闭服务器应用程序。

FYI dllhost是COM +托管流程。

为什么使用CoCreateInstance?而不是导入包装器并使用.net bcl来创建对象。

我唯一的另一个想法是你更好地解决挂起然后试图关闭池的问题。您是否通过COM +在VB中实际使用对象池?我似乎记得,如果没有VB6的限制,不能使用VB6 COM对象进行池化。