我的asp / C#站点有一个小功能,可以使用PIA通过excel导出一些数据。
经过几天的研究,关于如何正确使用所有这些,有时我得到这个错误:
无法使用已与其基础RCW分离的COM对象。
at Microsoft.Office.Interop.Excel.ApplicationClass.set_DisplayAlerts(Boolean RHS)
之后,我总是得到另一个错误,但我认为它与第一个错误相关/引起:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
at Microsoft.Office.Interop.Excel.ApplicationClass.Quit()
我感到非常困惑,因为我在三台计算机上测试了它,并且在其中两台计算机上工作正常。
相关代码如下:
public static class 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而不是main函数引起的? (我想尝试一下,但我在第三台计算机上多次部署代码有一些限制。)
如何正确管理代码以确保安全并避免此类错误?
提前致谢。