ManagementEventWatcher

ManagementEventWatcher

我已经建立了一个使用ManagementEventWatcher类的.net库。我的库是可抛弃的,因此通常我会将其包装在using语句中,而ManagementEventWatcher类将由我的库处置。

我的问题是我的库暴露给COM,并在不使用一次性模式的VB6中使用。如果用户不从其.net应用程序中调用库中的Dispose,或者由于VB6而无法调用该库,则ManagementEventWatcher类将从InvalidComObjectException中引发SinkForEventQuery.Cancel

我无法捕获该异常,因此它仍然未处理,这不好。我可以尝试一些解决方法吗?

System.Runtime.InteropServices.InvalidComObjectException was unhandled
  Message=COM object that has been separated from its underlying RCW cannot be used.
  Source=mscorlib
  StackTrace:
       at System.StubHelpers.StubHelpers.StubRegisterRCW(Object pThis, IntPtr pThread)
       at System.Management.IWbemServices.CancelAsyncCall_(IWbemObjectSink pSink)
       at System.Management.SinkForEventQuery.Cancel()
       at System.Management.ManagementEventWatcher.Stop()
       at System.Management.ManagementEventWatcher.Finalize()
  InnerException:

最佳答案

就在今天,我遇到了同样的问题,基本上我无法在类上调用dispose,并且未处理WMI对象,这给了我同样的错误。

最后,我要做的是实现一个不同于IDisposable的接口,公开了两个方法:Init和TearDown,并使用这些方法来设置并处理我的MEW。但是,这有点骇人听闻,如果该类的用户不知道这一点,他将永远不会调用这两种方法,并且您的MEW将永远不会启动或处置。

另一种方法可能是让类挂接到“ OnDestroy”之类的事件,然后通过拆除MEW对象来做出相应的响应。

    public void Init()
    {
        if (mew == null)
        {
            mew = new ManagementEventWatcher(query);
            mew.EventArrived += mew_EventArrived;
            mew.Start();
        }
    }

    public void TearDown()
    {
        if (mew != null)
        {
            mew.Stop();
            mew.Dispose();
            mew = null;
        }
    }


编辑:是的,我意识到这不是您想要的答案,我认为无论如何也没有办法避免这种情况,用户必须知道如何使用该类...:/

关于c# - ManagementEventWatcher-应用程序存在时InvalidComObjectException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3524690/

10-12 01:24