【问题标题】:Killing an out of process COM object from C#从 C# 中杀死进程外 COM 对象
【发布时间】:2009-05-20 10:00:05
【问题描述】:

我有一个进程外 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);

【问题讨论】:

  • 也许这表明是时候将旧的遗留组件移植到 .NET 了?
  • 我希望。数十名工程师重写这将需要数年时间。 :(

标签: c# com


【解决方案1】:

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

仅供参考 dllhost 是 COM+ 托管进程。

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

我唯一的另一个想法是您最好解决挂起问题,然后尝试关闭池。您实际上是通过 COM+ 在 VB 中使用对象池吗?我似乎记得,如果不超出 VB6 的约束,就无法使用 VB6 COM 对象进行池化。

【讨论】:

  • 嗨 Josh,我没有使用 COM+,我直接使用 dllhost(它涉及更改几个注册表项并如上所述进行实例化)。我在程序内部创建了 out of proc 对象的池。由于客户端限制,我们无法使用 COM+。
  • 呵呵,好吧,听起来很痛苦。你用的是RCW吗?包装 com 对象。有一种方法可以释放对 RCW 的所有引用。我想是在马歇尔身上。我认为 Kev 是时候重写了;-)
  • @Steve 你能控制在哪个用户下启动 dllhost.exe 吗?
猜你喜欢
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
相关资源
最近更新 更多