0

我有这段代码可以在 Excel 互操作应用程序中发布一些 COM 对象:

    . . .
    }
    Marshal.ReleaseComObject(_xlSheet);

    Marshal.ReleaseComObject(_xlSheets);

    _xlBook.Close(false, null, null);
    Marshal.ReleaseComObject(_xlBook);

    _xlApp.DisplayAlerts = false;
    _xlApp.Quit();
    OnChanged(EventArgs.Empty);
} // foreach (DataRowView drv in selectedUnits)
Marshal.ReleaseComObject(_xlApp);

在另一个地方,我还发布了那里使用的表:

Marshal.ReleaseComObject(_xlSheetDelPerf);

这一切都工作得很好,但是 Resharper Inspect > Code Issues in Solution在对Excel.Worksheet对象的两个 ReleaseComObject() 调用(但不是对工作表、工作簿或应用程序对象)。它们的定义如下:

using Excel = Microsoft.Office.Interop.Excel;
. . .
private Excel.Application _xlApp;
private Excel.Workbook _xlBook;
private Excel.Sheets _xlSheets;
private Excel.Worksheet _xlSheet;
private Excel.Worksheet _xlSheetDelPerf;

是什么让 Worksheet 如此 [un] 特别?更重要的是,我应该为他们删除 ReleaseComObject() 代码吗?并使用其他东西来释放它们?

注意: VVS在此处对“如何正确清理 Excel 互操作对象”问题的接受回答,有 474 个赞成票,确实显示以这种方式发布的工作表......?!?

更新

好的,我听从了 MethodMan 的建议(谁不会,有这样的绰号?),现在我有了:

            // Free up resources
            Marshal.ReleaseComObject(_xlSheet);

            Marshal.ReleaseComObject(_xlSheets);

            _xlBook.Close(false, null, null);
            Marshal.ReleaseComObject(_xlBook);

            _xlApp.DisplayAlerts = false;
            _xlApp.Quit();

            _xlSheet = null;
            _xlSheets = null;
            _xlBook = null;
        } //if (_xlSheet != null)
        OnChanged(EventArgs.Empty);
    } // foreach (DataRowView drvu in selectedUnits)
    Marshal.ReleaseComObject(_xlApp);
    _xlApp = null;
} // try
finally
{
    GC.Collect();
}
4

0 回答 0