C# 如何修复在实例化Excel.Application对象时随机发生的Excel.Application错误

C# 如何修复在实例化Excel.Application对象时随机发生的Excel.Application错误,c#,excel,interop,C#,Excel,Interop,我有一个c#程序,可以打开excel工作表,用一些数据填充它,并在关闭工作表之前从工作表中检索一些信息。这在一个循环中发生多次。程序执行一段时间以完成循环,然后在循环过程中随机失败,出现以下错误: System.Runtime.InteropServices.COMException(0x80080005):正在检索 由于错误,CLSID为{xxx}的组件的COM类因子失败 以下错误:80080005服务器执行失败[来自的异常] HRESULT:0x80080005(协同服务器故障) 我已检查了

我有一个c#程序,可以打开excel工作表,用一些数据填充它,并在关闭工作表之前从工作表中检索一些信息。这在一个循环中发生多次。程序执行一段时间以完成循环,然后在循环过程中随机失败,出现以下错误:

System.Runtime.InteropServices.COMException(0x80080005):正在检索 由于错误,CLSID为{xxx}的组件的COM类因子失败 以下错误:80080005服务器执行失败[来自的异常] HRESULT:0x80080005(协同服务器故障)

我已检查了我对Microsoft.Office.Interop.Excel的引用,它是Microsoft Excel 16.0对象库版本1.9.0.0,我已安装Excel 2016。导致问题的代码类似于以下代码:

for (int i = 0; i < 100; i++)
{
     Excel.Application xlApp;
     Excel.Workbooks xlWorkBooks;
     Excel.Workbook xlWorkBook;
     Excel.Sheets xlWorksheets;
     Excel.Worksheet xlWorkSheet;
     object misValue = System.Reflection.Missing.Value;

     xlApp = new Excel.Application(); //line that causes error

     xlApp.Visible = false;
     xlApp.ScreenUpdating = false;
     xlWorkBooks = xlApp.Workbooks;
     xlWorkBook = xlWorkBooks.Open(IIHSTemplate.Text, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
     xlWorksheets = xlWorkBook.Worksheets;
     xlWorkSheet = xlWorksheets["Automatic-Data-Analysis"];
     IIHSDemerit = Convert.ToDouble((xlWorkSheet.Cells[30, 14] as Excel.Range).Value2);

      xlWorkBook.Close(false, misValue, misValue);
      xlApp.Quit();

      releaseObject(xlWorksheets);
      releaseObject(xlWorkSheet);
      releaseObject(xlWorkBooks);
      releaseObject(xlWorkBook);
      releaseObject(xlApp);
}


private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
        }



for(int i=0;i<100;i++)
{
Excel.applicationxlapp;
Excel.工作簿xl工作簿;
Excel.工作簿;
Excel表格和工作表;
Excel工作表;
对象错误值=System.Reflection.Missing.Value;
xlApp=new Excel.Application();//导致错误的行
xlApp.Visible=false;
xlApp.screenUpdate=false;
xlWorkBooks=xlApp.Workbooks;
xlWorkBook=xlWorkBooks.Open(IIHSTemplate.Text,0,false,5,“,”,true,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,“\t”,false,false,false,0,true,1,0);
xlWorksheets=xlWorkBook.Worksheets;
xlWorkSheet=xlWorksheets[“自动数据分析”];
IIHSDemerit=Convert.ToDouble((xlsheet.Cells[30,14]为Excel.Range.Value2);
xlWorkBook.Close(false、misValue、misValue);
xlApp.Quit();
发布对象(xlWorksheets);
releaseObject(xlWorkSheet);
发布对象(XLWorkbook);
releaseObject(xlWorkBook);
释放对象(xlApp);
}
私有无效释放对象(对象obj)
{
尝试
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj=null;
}
捕获(例外情况除外)
{
obj=null;
Show(“释放对象时发生异常”+ex.ToString());
}
最后
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}

我的程序将excel数据的结果写入一个文本文件,并执行多次,没有错误。经过随机次数的迭代(每次运行程序的次数不同)程序将因上面列出的错误而失败。关于导致错误的原因以及如何纠正错误,您有什么想法吗?

解决方案是将Excel app对象的实例化和发布移出循环,因为我只需要在循环中打开和关闭工作簿。感谢@SmrtGrunt在注释中指出这一点。

是否有理由在循环内部创建和发布Excel应用程序?当您只是打开和关闭工作簿时,似乎没有必要这样做。这可能是一个原因,因为系统正试图快速启动和停止Excel副本。传统错误,即releaseObject()调用没有任何用处。使用任务管理器的“进程”选项卡可以查看您创建的大量Excel.exe实例。这确实会在某个地方停止,Excel是一个非常昂贵的进程。只需启动一次就可以了。注销并重新登录以快速从进程爆炸中恢复。@Hans Passant-我检查了任务管理器和f或者每次运行都会启动和停止Microsoft Excel(32)位进程。Excel.exe进程没有累积。@SmrtGrunt-感谢您的建议。以前没有注意到,但在阅读您的评论并思考之后,这是很明显的。请立即尝试。