"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 изнутри этой функции вместо основной функции? (Я хотел бы попробовать, но у меня есть некоторые ограничения для многократного развертывания кода на третьем компьютере).

Как правильно управлять кодом, чтобы сделать его безопасным и избежать ошибок такого рода?

Заранее спасибо.

0 ответов

Другие вопросы по тегам