获得';InvalidComObjectException';退出时
本文关键字:退出 InvalidComObjectException 获得 | 更新日期: 2023-09-27 18:25:08
在C#中查看Crystal Reports文档后,应用程序在退出时会出现此错误。
我已经在报告中调用了Close()和Dispose()方法。
从我所读到的内容来看,之所以会发生这种情况,是因为COM对象在卸载后被调用,但我不知道这种情况是如何发生的,也不知道发生在哪里。
以前有人见过这个吗?或者你可以推荐一个工具来追踪问题吗?
谢谢!
[编辑]
抛出异常时的堆栈跟踪:
CrystalDecisions.CrystalReports.Engine.dll!CrystalDecision.ReportAppServer.ISDClientDocumentEvents_EventProvider.RemoveOnClosed(CrystalDecisions.ReportAppServer.ClientDoc_ISCDClientDocumentEvents_OnClosedEventHandler处理程序)+0x137字节
CrystalDecisions.CrystalReports.Engine.dll!CrystalDecision.ReportAppServer.ISDClientDocumentEvents_EventProvider.OnClosed.remove(CrystalDecisions.ReportAppServer.ClientDoc_ISCDClientDocumentEvents_OnClosedEventHandler值)+0x33字节
CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.DisconnectEventRelay()+0x75字节CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.InternalClose(bool bSetupForNextReport,bool bAutoClose)+0x10e字节
CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.Dispose(bool bDisposeManaged)+0xb6字节
System.dll!System.ComponentModel.Component.Dispose()+0x15字节
CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.CrystalReports.Engine.ReportDocument.ClearCache(bool-clearDocument)+0x1dd字节
CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.CrystalReports.Engine.ReportDocument.InteralClose(bool bSetupForNextReport)+0x81字节
CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.CrystalReports.Engine.ReportDocument.Close()+0x3f字节
CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.CrystalReports.Engine.ReportDocument.ExitHandler(对象发送器,System.EventArgs e)+0x120字节
kernel32.dll!75e6339()
[下面的帧可能不正确和/或丢失,没有为kernel32.dll加载符号]
ntdll.dll!77269ef2()
ntdll.dll!77269ec5()
事实证明,这是由线程处理引起的——显示报告的窗体在一个单独的线程中,当主线程退出时抛出异常。
如果其他人有这个问题,请尝试只在主线程中使用Crystal Reports。
如果要处理Com对象,则必须调用类似于以下的COMObjects
Release方法
System.Runtime.InteropServices.Marshal.ReleaseComObject( YourComObjects Name );