退出时获取'InvalidComObjectException'?

时间:2012-02-20 16:26:32

标签: c# exception crystal-reports

在C#中查看Crystal Reports文档后,应用程序在退出时会出现此错误。

我在报告上调用了Close()和Dispose()方法。

从我读过的内容来看,这是因为COM对象在卸载后被调用,但我看不出这是怎么回事。

有没有人见过这个?或者你能推荐一种工具来追踪问题吗?

谢谢!

[编辑]

抛出异常时的堆栈跟踪:

  

CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.ReportAppServer.ISCDClientDocumentEvents_EventProvider.RemoveOnClosed(CrystalDecisions.ReportAppServer.ClientDoc._ISCDClientDocumentEvents_OnClosedEventHandler handler)+ 0x137 bytes
      CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.ReportAppServer.ISCDClientDocumentEvents_EventProvider.OnClosed.remove(CrystalDecisions.ReportAppServer.ClientDoc._ISCDClientDocumentEvents_OnClosedEventHandler value)+ 0x33 bytes
      CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.DisconnectEventRelay()+ 0x75 bytes       CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.InternalClose(bool bSetupForNextReport,bool bAutoClose)+ 0x10e bytes
      CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.Dispose(bool bDisposeManaged)+ 0xb6 bytes
      System.dll!System.ComponentModel.Component.Dispose()+ 0x15 bytes
      CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.CrystalReports.Engine.ReportDocument.ClearCache(bool clearDocument)+ 0x1dd bytes
      CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.CrystalReports.Engine.ReportDocument.InternalClose(bool bSetupForNextReport)+ 0x81 bytes
      CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.CrystalReports.Engine.ReportDocument.Close()+ 0x3f bytes
      CrystalDecisions.CrystalReports.Engine.dll!CrystalDecisions.CrystalReports.Engine.ReportDocument.ExitHandler(对象发送者,System.EventArgs e)+ 0x120字节
      KERNEL32.DLL!75e6339a()
      [下面的框架可能不正确和/或缺失,没有为kernel32.dll加载符号]
      ntdll.dll中!77269ef2()
      ntdll.dll!77269ec5()

2 个答案:

答案 0 :(得分:0)

如果要处置Com对象,则必须调用COMObjects Release方法,如下所示

System.Runtime.InteropServices.Marshal.ReleaseComObject( YourComObjects Name ); 

答案 1 :(得分:0)

事实证明这是由线程引起的 - 显示报告的表单处于单独的线程中,并且当主线程退出时抛出异常。

如果其他人遇到此问题,请尝试仅在主线程中使用Crystal Reports。