我已经构建了一个使用ManagementEventWatcher
类的.net库。我的库是一次性的,所以通常我会将它包装在using语句中,ManagementEventWatcher
类会被我的库处理掉。
我的问题是我的库暴露给COM,并在VB6中使用,它不使用一次性模式。如果用户没有从他们的.net应用程序中调用库中的dispose,或者因为VB6而无法调用,则ManagementEventWatcher
类将从InvalidComObjectException
我无法捕获异常,所以它仍然未处理,这是不好的。我可以尝试一些变通方法吗?
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:
答案 0 :(得分:0)
我今天遇到了同样的问题,基本上我无法在类上调用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;
}
}
编辑:是的我意识到这不是你要找的答案,我认为无论如何都有办法避免这种情况,用户必须知道如何使用该课......:/