GetVstoObject因AccessViolationException失败

我正在用Excel 2010和VSTO 4在.NET 4.0(C#)中开发Excel加载项。在我的Excel存取器类中,我有一个返回VSTO扩展活动工作簿的属性“CurrentWorkbook”:

public Microsoft.Office.Tools.Excel.Workbook CurrentWorkbook { get { if (Globals.ThisAddIn.Application.ActiveWorkbook == null) return null; return Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook); } } 

通常,这工作正常。 但有些情况下, GetVstoObject失败并带有AccessViolationException

  at Microsoft.VisualStudio.Tools.Office.Runtime.Interop.IHostItemFactoryNoMAF.CreateProvider(Object document) at Microsoft.Office.Tools.Excel.WorkbookImpl.GetVstoObject(_Workbook workbook, IServiceProvider serviceProvider, UInt32 officeVersion) at Microsoft.Office.Tools.Excel.ApplicationFactoryImpl.GetVstoWorkbook(_Workbook workbook) at Microsoft.Office.Tools.Excel.ApplicationFactoryImpl.GetVstoObject(_Workbook workbook) at TNPExcelAddIn2.ConnectionLayer.ExcelAccess.ExcelAccessor.get_CurrentWorkbook() 

提示:在错误情况下, Globals.ThisAddIn.Application.ActiveWorkbook不为null ,但在Debugger中,您可以看到底层的Sytem.__ComObject有些“损坏”,因为它的m_ObjectToDataMapnull

  • 任何猜测?
  • 我该如何处理?
  • 或者如何在使用GetVstoObject之前“testing” System.__ComObject

Jörg,先谢谢你的回答

好的,事实certificate,特定的XLSX-Workbook不正常,因为XLSX-ZIP-Container中存在损坏的graphics对象。 Excel本身忽略了这一点,但VSTO层似乎有问题。

我结束了使用以下解决scheme来捕捉错误:

 public Microsoft.Office.Tools.Excel.Workbook CurrentWorkbook { get { return GetVSTOWorkbookByInteropWorkbook(Globals.ThisAddIn.Application.ActiveWorkbook); } } [HandleProcessCorruptedStateExceptions] public static ExcelVSTO.Workbook GetVSTOWorkbookByInteropWorkbook(ExcelInterop.Workbook workbook) { if (workbook == null) return null; try { return Globals.Factory.GetVstoObject(workbook); } //This also catches unhandled "AccessViolationException" in the VSTO layer because //we have decorated the method by the annotation [HandleProcessCorruptedStateExceptions]. catch (AccessViolationException ex) { //Handle exception... } } 

Jörg,希望这也能帮助其他人