我有一个独立的 .exe COM 服务器和一个简单的 C# 测试程序,它启动一个服务器实例并在之后立即关闭它。奇迹般有效。但是,如果我关闭 C# 程序本身,我会在终结器运行期间遇到异常,因为它试图从不再运行的 COM 服务器中注销/取消通知 COM 事件接收器。
异常是
“在 mscorlib.dll 中发生 System.Runtime.InteropServices.InvalidComObjectException 类型的第一次机会异常”
调用堆栈:
mscorlib.dll!System.Runtime.InteropServices.ComEventsSink.Unadvise() + 0x20 字节 mscorlib.dll!System.Runtime.InteropServices.ComEventsSink.RemoveAll(System.Runtime.InteropServices.ComEventsSink sinks) + 0x11 字节
mscorlib。 dll!System.Runtime.InteropServices.ComEventsInfo.Finalize() + 0x18 字节
我可以通过在关闭服务器之前手动删除 COM 事件处理程序来修复此错误。即 myComServer.OnFunkyEvent -= OnFunkyEventHandler; 但是,我发现这不雅、容易出错且乏味。所以问题是,我能否以某种方式手动触发我的 COM 事件的 RemoveAll() 调用,使其不会在终结器中运行?