/ / GetVstoObject kończy się niepowodzeniem z AccessViolationException - .net, excel, c # -4.0, vsto

GetVstoObject kończy się niepowodzeniem z AccessViolationException - .net, excel, c # -4.0, vsto

Zajmuję się dodatkiem programu Excel w .NET 4.0 (C #) z Excel 2010 i VSTO 4. W mojej klasie dostępu programu Excel mam właściwość "CurrentWorkbook", która zwraca aktywny aktywny skoroszyt 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);
}
}

Normalnie działa to dobrze. Ale są sytuacje, w których GetVstoObject zawiedzie z 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()

Wskazówka: W przypadku błędu Globals.ThisAddIn.Application.ActiveWorkbook nie jest null, ale w Debuggerze widać, że to jest ukryte Sytem.__ComObject jest nieco "uszkodzony", ponieważ jest m_ObjectToDataMap jest null.

  • Jakieś domysły ???
  • Jak sobie z tym poradzić?
  • Albo jak mogę "przetestować" System.__ComObject przed użyciem GetVstoObject?

Dzięki z góry za odpowiedzi, Jörg

Odpowiedzi:

2 dla odpowiedzi № 1

OK, okazuje się, że konkretny podręcznik XLSXnie było w porządku, ponieważ w XLSX-ZIP-Container były uszkodzone obiekty graficzne. Sam Excel zignorował to, ale warstwa VSTO wydawała się mieć z tym problemy.

Skończyło się na użyciu następującego rozwiązania, aby złapać błędy:

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...
}
}

Ma nadzieję, że to pomaga także innym, Jörg