我正在使用 Excel 2010 和 VSTO 4 在 .NET 4.0 (C#) 中开发 Excel 加载项。 在我的 Excel 访问器类中,我有一个属性“CurrentWorkbook”,它返回 VSTO 扩展事件工作簿:
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
,但在调试器中您可以看到底层 Sytem.__ComObject
是有点“损坏”,因为它的 m_ObjectToDataMap
是 null
。
- 有什么猜测吗???
- 我该如何处理这个问题?
- 或者如何在使用
GetVstoObject
之前“测试”System.__ComObject
?
预先感谢您的回答, 约尔格
最佳答案
好吧,事实证明,特定的 XLSX-Workbook 不正常,因为 XLSX-ZIP-Container 中存在损坏的图形对象。 Excel本身忽略了这一点,但VSTO层似乎有问题。
我最终使用以下解决方案来捕获错误:
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...
}
}
希望这也能帮助其他人, 约尔格
关于.net - GetVstoObject 失败并出现 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19591157/