.net - GetVstoObject 失败并出现 AccessViolationException

标签 .net excel c#-4.0 vsto

我正在使用 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_ObjectToDataMapnull

  • 有什么猜测吗???
  • 我该如何处理这个问题?
  • 或者如何在使用 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/

相关文章:

c# - 使用 C# 自动生成字母数字唯一 ID

c# - 在 Entity Framework 4 中映射自定义 POCO

excel - VBA设置电子表格字体大小和行大小?

excel - 在我打开的任何 CSV 文件上运行宏,而不仅仅是我有文件名的文件

c#-4.0 - 非静态字段、方法或属性需要对象引用

c# - 如何在 WPF 中播放 Youtube 视频

asp.net - 如何仅在单击按钮后显示正则表达式验证消息?

javascript - 使用多个 Math.pow 将 Excel 公式转换为 Javascript

c# - Windows 中挂起/恢复时套接字会发生什么

C# 正则表达式匹配与拆分相同字符串