C# 如何释放Excel对象

C# 如何释放Excel对象,c#,excel,for-loop,foreach,marshalling,C#,Excel,For Loop,Foreach,Marshalling,在下面的代码中,我有一个注释掉的foreach循环,它可以工作,但由于后台枚举,它不会释放excel对象。所以我尝试将它转换为for循环,但直到现在我已经避免了for循环,我似乎无法让我的循环工作。我只是指出我知道它坏了 我确实注释掉了坏掉的“for”循环,它运行起来,所有的工作都按照预期进行,除了我不能释放excel对象。。。 我的问题是,我已经尝试了很多不同的例子,但是我不能从我的任务管理器中释放excel对象,它在后台仍然是开放的 我使用一点法则 我用的是试一试/决赛 我已经尝试了许多不同

在下面的代码中,我有一个注释掉的foreach循环,它可以工作,但由于后台枚举,它不会释放excel对象。所以我尝试将它转换为for循环,但直到现在我已经避免了for循环,我似乎无法让我的循环工作。我只是指出我知道它坏了

我确实注释掉了坏掉的“for”循环,它运行起来,所有的工作都按照预期进行,除了我不能释放excel对象。。。 我的问题是,我已经尝试了很多不同的例子,但是我不能从我的任务管理器中释放excel对象,它在后台仍然是开放的

我使用一点法则 我用的是试一试/决赛 我已经尝试了许多不同的Marshal.ReleaseComOjbectobj,这些都是来自web的示例 我使用的是“for循环”而不是foreach循环,因此没有隐藏的枚举对象 谢谢你的帮助,教育

我的代码:

public static List<ExcelObject> listOfExcelObjects = new List<ExcelObject>();
    public static void txtSearchBar_Changed(object sender, EventArgs e)
    {
        Excel.Application excel = null;
        Excel.Workbooks workbooks = null;
        Excel.Workbook workbook = null;
        Excel.Sheets sheets = null;
        Excel.Worksheet worksheet = null;
        Excel.Range range = null;

        try
        {
            excel = new Excel.Application();
            workbooks = excel.Workbooks;
            workbook = workbooks.Open(GlobalObject.filePath, Notify: false, ReadOnly: true);
            sheets = workbook.Sheets;

            for (int i = 1; i < sheets.Count; i++)
            {
                worksheet = sheets.Item[i];
                if (worksheet.Visible == Excel.XlSheetVisibility.xlSheetVisible)
                {
                    Form_MainForm.thisForm.cmbx_WorkSheet.Items.Add(sheets.Item[i].Name);
                    if (worksheet.Name == "UNIT FEEDER")
                    {
                        Form_MainForm.thisForm.cmbx_WorkSheet.Text = worksheet.Name;
                        worksheet.Select();

                        Form_MainForm.thisForm.txtBox_StartingRow.Text = $"11";
                        Form_MainForm.thisForm.txtBox_EndingRow.Text = $"{_Events.EndOfRow()}";

                        range = worksheet.Range[$"A{Int32.Parse(Form_MainForm.thisForm.txtBox_StartingRow.Text)}", $"A{Int32.Parse(_Events.EndOfRow())}"];
                        for (int j = 1; j < range.Cells.Count; j++)
                        {
                            _Events.listOfExcelObjects.Add(new ExcelObject() { FeederNumber = range.Cells.Item[j] });
                        }

                        //foreach (Excel.Range j in worksheet.Range[$"A{Form_MainForm.thisForm.txtBox_StartingRow.Text}", $"A{_Events.EndOfRow()}"].Cells)
                        //{
                        //    _Events.listOfExcelObjects.Add(new ExcelObject() { FeederNumber = j.Value });
                        //}

                        Form_MainForm.thisForm.grd_DataGridView.DataSource = _Events.listOfExcelObjects;

                    }

                }

            }

        }
        finally
        {

            releaseObject(range);
            releaseObject(worksheet);
            releaseObject(sheets);
            releaseObject(workbook);
            releaseObject(workbooks);
            releaseObject(excel);
            //Marshal.ReleaseComObject(range);
            //Marshal.ReleaseComObject(worksheet);
            //Marshal.ReleaseComObject(sheets);
            //Marshal.ReleaseComObject(workbook);
            //Marshal.ReleaseComObject(workbooks);
            //Marshal.ReleaseComObject(excel);
        }


    }

    private static void releaseObject(object obj)
    {
        if (obj != null && Marshal.IsComObject(obj))
        {
            Marshal.ReleaseComObject(obj);
        }
        obj = null;
    }

您需要关闭Excel:

excel.Quit();

对于那些没有阅读评论部分“比如我自己”的人

我有一个函数EndOfRow,我没有做任何清洁来释放物体。创建此函数时,我不知道如何释放对象,但我忘记了它。在一个简单的疏忽上花费了很多时间

忽略辞职也是我解决问题的许多努力中的一个疏忽,但不是主要问题,EndOfRow是

因此,我学到的是在使用excel完成后立即释放对象


谢谢Terry

嗨Terry,我修改了我的代码如下,退出确实关闭了一个后台流程,但我还有两个excel流程仍然打开。所以我还是做错了什么。释放对象范围;发布对象工作表;发布目标表;如果是工作簿!=null{workbook.Closefalse,System.Reflection.Missing.Value,System.Reflection.Missing.Value;}releaseObjectworkbook;发布对象工作簿;如果excel!=null{excel.Quit;}releaseObjectexcel@AlanC您确定这些其他流程不是以前遗留下来的吗?请尝试终止所有Excel进程,然后重试您的代码。我以前也有过类似的问题。Excel在自动化之后,在周围闲逛是很糟糕的。是的,谢谢你。。。我的内胎我没有做任何清洁的功能。当我创建此函数时,我不知道如何清理,但我忘记了它。。。再次感谢