/ / GetVstoObject AccessViolationException के साथ विफल रहता है - .NET, एक्सेल, सी # -4.0, vsto

GetVstoObject AccessViolationException के साथ विफल रहता है - .NET, एक्सेल, सी # -4.0, vsto

मैं एक्सेल 2010 और वीएसटीओ 4 के साथ .NET 4.0 (सी #) में एक्सेल ऐड-इन विकसित कर रहा हूं। मेरे एक्सेल एक्सेसर क्लास में मेरे पास एक संपत्ति "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.

  • कोई अंदाज़ा???
  • मैं इससे कैसे निपट सकता हूं?
  • या मैं "परीक्षण" कैसे कर सकता हूं System.__ComObject उपयोग करने से पहले GetVstoObject?

आपके जवाब के लिए पहले से ही धन्यवाद, जोर्ग

उत्तर:

जवाब के लिए 2 № 1

ठीक है, यह पता चला है कि विशिष्ट एक्सएलएसएक्स-वर्कबुकठीक नहीं था, क्योंकि एक्सएलएसएक्स-ज़िप-कंटेनर में भ्रष्ट ग्राफिक ऑब्जेक्ट्स थे। एक्सेल ने स्वयं इसे अनदेखा कर दिया, लेकिन वीएसटीओ परत को इसके साथ समस्याएं लग रही थीं।

मैं त्रुटियों को पकड़ने के लिए निम्नलिखित समाधान का उपयोग करने में समाप्त हुआ:

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

उम्मीद है कि यह दूसरों की भी मदद करता है, जोर्ग