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_ObjectToDataMap
为null
。
- 任何猜测?
- 我该如何处理?
- 或者如何在使用
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,希望这也能帮助其他人