如何恢复尚未正确释放的COM对象?

当有人使用任务pipe理器来结束已经实例化COM对象的.NET进程时,AFAIK无法在using {}using {}或事件处理块中try {} finally {}调用Marshal.FinalReleaseComObject try {} finally {}

下一次启动应用程序时,COM对象处于不可用状态,我需要重新启动机器以使其再次工作。

我使用Marshal.BindToMoniker来实例化对象。

我做错了什么,有什么我错过了?


我尝试了赛义德的build议,但没有奏效

 private const int WM_CLOSE = 0x0010; protected override void WndProc(ref Message m) { if (m.Msg == WM_CLOSE) { logger.Info("WM_CLOSE"); Marshal.FinalReleaseComObject(comObject); } base.WndProc(ref m); } 

任务管理器正在使用Process.Kill (或可能更强大)的本地等价物。 从文档中注意这个叙述:

Kill强制终止进程,而CloseMainWindow只请求终止。

调用CloseMainWindow发送一个请求以关闭主窗口,在一个格式良好的应用程序中…

和,

如果您调用Kill ,流程编辑的数据或分配给流程的资源可能会丢失。 Kill会导致进程异常终止,只能在必要时使用。

简而言之,在程序代码中没有任何事情可以做到,以防止这种情况发生 – 插头已经被拔出。 没有窗口消息将被发送。

你可能不需要。 当垃圾收集器开始释放内存时,它会检查对象是否有一个尚未调用的Dispose()方法。 如果Dispose()方法没有被调用,它会调用它。

我正在测试这个控制台的应用程序,并有3个扬声器在我的Dispose功能。 退出应用程序后,如果不在对象上调用Dispose,则需要大约30秒才能听到3声哔哔声。 时间是不确定的。

当然,对象必须被正确编码。

你是否试图在关机后立即运行应用程序? 为什么不等几分钟,看看是否有效?

编辑:我假设你有你的Dispose函数中的Marshal.FinalReleaseComObject。