猿问

C# excel 互操作过程在崩溃后仍然存在

我最近刚刚开始在 C# 中使用 Excel Interop,并且遇到了一个问题,如果我的应用程序崩溃,Excel 进程会持续存在。(为什么进程崩溃是我正在调查的一个单独问题。)


我想我正在正确释放 COM 对象,因为如果我的应用程序成功完成,一切都会清理干净。只有当它崩溃或我在调试过程中碰巧退出时,Excel 进程才会被保留。


当然,我意识到当它崩溃时,COM 对象没有被清除。我不知道如何处理这个。


这里有一些伪代码,希望能演示我在做什么(真正的代码很长。)


它应该 1) 打开现有的 excel 文件,2) 访问文件中的特定工作表,3) 插入很多行,4) 向这些行添加值,5) 关闭并保存所有内容。


我做错了什么?


    // Open excel file

    try {

        myExcelApp = new Excel.Application();

        myExcelApp.Visible = false;

        myExcelApp.DisplayAlerts = false;

        myExcelWorkbook = (Excel.Workbook)myExcelApp.Workbooks.Open(excelFile);

    } catch (Exception ex) {

        string msg = "Error:Failed opening Excel File " + excelFile + ": " + ex.Message;

        throw new Exception(msg);

    }


    // ---- some other stuff here. ----


    foreach ( var toolWorkSheetName in workSheetsList ){


        // Init

        Excel.Worksheet xlWorksheet = null;

        Excel.Range xlRange = null;


        // Get specific worksheet from workbook

        try {

            xlWorksheet = (Excel.Worksheet)myExcelWorkbook.Worksheets[toolWorkSheetName];

        } catch (Exception ex) {

            string msg = "Error:Could not open worksheet in " + toolWorkSheetName + ": " + ex.Message;

            throw new Exception(msg);

        }



慕标琳琳
浏览 210回答 2
2回答

HUX布斯

在您的 try catch 中,您应该关闭 Excel。像这样      try{            //Some code        }    catch{       Marshal.ReleaseComObject(xlWorksheet);        myExcelWorkbook.Close();         myExcelApp.Quit();     }当它失败时,它不会关闭 Excel。

MMMHUHU

您正在释放try-catch集团之外的对象。在捕获中,即使有新消息,您也会创建一个新异常。当您从 catch 块创建新异常时,您的原始异常消失了。被认为是一种不好的做法。您必须释放catch或finally块内的对象。根据您的代码,您的对象在崩溃后仍然存在。顺便说一句,要使用 Excel,我会推荐EPPlus库。它将执行您需要的所有操作,而无需在服务器上安装 Excel(再次不好的做法)。更新清理所有对象:           System.Runtime.InteropServices.Marshal.ReleaseComObject(startCell );               System.Runtime.InteropServices.Marshal.ReleaseComObject(endCell);                      System.Runtime.InteropServices.Marshal.ReleaseComObject(writeRange);            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange );        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorksheet);            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange );            startCell = null;            endCell = null;            writeRange = null;            myExcelApp.Quit();          System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcelApp);            myExcelApp = null;            myExcelWorkbook = null;            System.GC.Collect();            GC.WaitForPendingFinalizers();
随时随地看视频慕课网APP
我要回答