【问题标题】:WMI Exception: "COM object that has been separated from its underlying RCW cannot be used"WMI 异常:“无法使用已与其基础 RCW 分离的 COM 对象”
【发布时间】:2011-04-26 14:45:14
【问题描述】:

我正在订阅 WMI 事件,并在我的应用程序关闭时收到“无法使用与其底层 RCW 分离的 COM 对象”错误。有人问过这个问题before,但和我的情况完全不同。

我从我的主线程调用这段代码:

string strComputer = @".";
ManagementScope scope = new ManagementScope(@"\\" + strComputer + @"\root\wmi");
scope.Connect();

EventQuery query = new EventQuery("Select * from MSNdis_StatusMediaDisconnect");

ManagementEventWatcher watcher = new ManagementEventWatcher(scope, query);

watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); // some function that does stuff when the event occurs.
watcher.Start();

事件报告正确。我怀疑这个问题与我的应用程序关闭时这些对象被释放的方式有关。如何防止错误?我应该在我的应用程序关闭之前显式处理观察者、范围和查询吗?

【问题讨论】:

  • 非常老的问题,但由于这是 COM RCW 上的第一次命中,我想补充一点,当您在处理某些 COM 对象之前关闭窗口时,通常会发生这种情况(因为它们隐式依赖于 Window处理)。在Window.OnClosing事件中添加一些清理代码可以解决这个问题。

标签: c# winforms com wmi


【解决方案1】:

好吧,WMI 启用了 COM,这个异常并不完全神秘。我怀疑终结器中存在竞争,请尝试在让程序终止之前调用观察者的 Stop() 方法来修复它。

【讨论】:

  • 首先我覆盖了 Dispose 并试图在那里停止观察者,但错误发生在此之前,所以在明确停止观察者之后,错误就解决了!谢谢汉斯!
猜你喜欢
  • 2021-09-23
  • 2011-03-11
  • 2012-04-23
  • 1970-01-01
  • 2011-11-21
  • 2012-04-27
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多