"COM-объект, который был отделен от базового RCW, не может быть использован"
У меня есть небольшая функция на моем сайте asp / C#, которая экспортирует некоторые данные через Excel, используя PIA.
После нескольких дней исследований о том, как правильно использовать все это, иногда я получаю эту ошибку:
COM-объект, который был отделен от базового RCW, не может быть использован.
в Microsoft.Office.Interop.Excel.ApplicationClass.set_DisplayAlerts(логическое RHS)
После этого я всегда получаю еще одну ошибку, но я полагаю, что она связана / вызвана первой ошибкой:
Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.
в Microsoft.Office.Interop.Excel.ApplicationClass.Quit()
Я чувствую себя смущенным, потому что я проверил это на трех компьютерах, и отлично работает на двух из них.
Соответствующий код следующий:
открытый статический класс Export {
public static Application objExcel;
public static Workbooks objBooks;
public static _Workbook objBook;
public static Sheets objSheets;
public static _Worksheet objSheet;
public static Boolean export (DataSet ds, String path)
{
try
{
objExcel = new Application();
objBooks = objExcel.Workbooks;
objBook = objBooks.Add(XlWBATemplate.xlWBATWorksheet);
objSheets = objBook.Worksheets;
objSheet = (_Worksheet)objSheets.get_Item(1);
Range objRange = null;
//Do things . . .
MergeCells(objExcel, objSheet);
//Do more things . . .
catch (Exception ex)
{
Global.ManageException(ex);
}
finally
{
if (objExcel != null)
objExcel.Quit();
ReleaseComObject(objExcel);
ReleaseComObject(objBooks);
ReleaseComObject(objBook);
ReleaseComObject(objSheets);
ReleaseComObject(objSheet);
ReleaseComObject(objRange);
}
RelecaseComObject () является следующим:
private static void ReleaseComObject(object reference)
{
try
{
if(reference!=null)
while(System.Runtime.InteropServices.Marshal.ReleaseComObject(reference) > 0)
{}
}
catch (Exception e)
{
Global.ManageException(e);
}
}
И MergeCells() выглядит примерно так:
private static void MergeCells(Application objExcel, _Worksheet objSheet)
{
objExcel.DisplayAlerts = false;
// Do things
objExcel.DisplayAlerts = true;
}
Если посмотреть на строку ошибки, может ли она быть вызвана вызовом objExcel.DisplayAlerts изнутри этой функции вместо основной функции? (Я хотел бы попробовать, но у меня есть некоторые ограничения для многократного развертывания кода на третьем компьютере).
Как правильно управлять кодом, чтобы сделать его безопасным и избежать ошибок такого рода?
Заранее спасибо.