我已经建立了一个使用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/