为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕标琳琳 2021-08-22 14:46:12
我最近刚刚开始在 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);        }
查看完整描述

2 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

在您的 try catch 中,您应该关闭 Excel。像这样


      try{

            //Some code

        }

    catch{

       Marshal.ReleaseComObject(xlWorksheet);

        myExcelWorkbook.Close();

         myExcelApp.Quit();


     }

当它失败时,它不会关闭 Excel。


查看完整回答
反对 回复 2021-08-22
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您正在释放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();


查看完整回答
反对 回复 2021-08-22
  • 2 回答
  • 0 关注
  • 209 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信