Excel process not closing

This question already has an answer here:

  • How do I properly clean up Excel interop objects? 36 answers

  • Here is an interesting knowledge base on the subject of office apps staying open after a .NET app disconnects from them.

    Office application does not quit after automation from Visual Studio .NET client

    The code examples are all in the link (vb.net sorry). Basically it shows you how to correctly setup and tear down the office app so that it closes when you're finished with it.

    System.Runtime.InteropServices.Marshal.FinalReleaseComObject is where the magic happens.

    EDIT: You need to call the FinalReleaseComObject for each excel object that you've created.

    if (excelWorkSheet1 != null)
    {
        Marshal.FinalReleaseComObject(excelWorkSheet1);
        excelWorkSheet1 = null;
    }
    if (excelWorkbook != null)
    {
        Marshal.FinalReleaseComObject(excelWorkbook);
        excelWorkbook = null;
    }
    if (excelApp != null)
    {
        Marshal.FinalReleaseComObject(excelApp);
        excelApp = null;
    }
    

    DotNet only release the COM object after all the handles have been released. What I do is comment everything out, and then add back a portion. See if it release Excel. If it did not follow the following rules. When it release, add more code until it does not release again.

    1) When you create your Excel variables, set all the values to null (this avoid not initiated errors)

    2) Do not reuse variables without releasing it first Marshal.FinalReleaseComObject

    3) Do not double dot (ab = z) . dotNet create a temporary variable, which will not get released.

    c = a.b;
    c = z;
    Marshal.FinalReleaseComObject(c);
    

    4) Release ALL excel variables. The quicker the better.

    5) Set it back to NULL.

    Set culture to "en-US". There is a bug that crash Excel with some cultures. This ensure it won't.

    Here is an idea of how your code should be structured:

            thisThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            InteropExcel.Application excelApp = null;
            InteropExcel.Workbooks wkbks = null;
            InteropExcel.Workbook wkbk = null;
            try
            {
                    excelApp = new InteropExcel.Application();
                    wkbks = excelApp.Workbooks;
                    wkbk = wkbks.Open(fileName);
    ...
    
            }
            catch (Exception ex)
            {
            }
    
            if (wkbk != null)
            {
                excelApp.DisplayAlerts = false;
                wkbk.Close(false);
                Marshal.FinalReleaseComObject(wkbk);
                wkbk = null;
            }
    
            if (wkbks != null)
            {
                wkbks.Close();
                Marshal.FinalReleaseComObject(wkbks);
                wkbks = null;
            }
    
            if (excelApp != null)
            {
                // Close Excel.
                excelApp.Quit();
                Marshal.FinalReleaseComObject(excelApp);
                excelApp = null;
            }
    
            // Change culture back from en-us to the original culture.
            thisThread.CurrentCulture = originalCulture;    
        }
    

    I finally got it to close. You need to add a variable for the Workbooks collection, and then use the FinalReleaseComObject as stated in the other answers. I guess every possible Excel COM object that you use must be disposed this way.

    try
            {
               // Create an instance of Microsoft Excel and make it invisible
               excelApp = new Excel.Application();
               excelApp.DisplayAlerts = false;
               excelApp.Visible = false;
    
               // open a Workbook and get the active Worksheet
    
               excelWorkbooks = excelApp.Workbooks;
               excelWorkbook = excelWorkbooks.Open(excelFile, Type.Missing, true);
               excelWorkSheet1 = excelWorkbook.ActiveSheet;
    
            }
            catch
            {
               throw;
            }
            finally
            {
    
               NAR( excelWorkSheet1 );
               excelWorkbook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
               NAR(excelWorkbook);
               NAR(excelWorkbooks);
               excelApp.Quit();
               NAR(excelApp);
    
            }
         }
         private void NAR(object o)
         {
            try
            {
               System.Runtime.InteropServices.Marshal.FinalReleaseComObject( o );
            }
            catch { }
            finally
            {
               o = null;
            }
         }
    
    链接地址: http://www.djcxy.com/p/73530.html

    上一篇: 在woocommerce新订单电子邮件中显示产品缩略图

    下一篇: Excel进程不关闭