“无法使用已与其基础RCW分离的COM对象”

时间:2016-02-11 09:39:49

标签: c# excel com rcw pia

我的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函数引起的? (我想尝试一下,但我在第三台计算机上多次部署代码有一些限制。)

如何正确管理代码以确保安全并避免此类错误?

提前致谢。

0 个答案:

没有答案