C# 如何修复在实例化Excel.Application对象时随机发生的Excel.Application错误
我有一个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。导致问题的代码类似于以下代码:C# 如何修复在实例化Excel.Application对象时随机发生的Excel.Application错误,c#,excel,interop,C#,Excel,Interop,我有一个c#程序,可以打开excel工作表,用一些数据填充它,并在关闭工作表之前从工作表中检索一些信息。这在一个循环中发生多次。程序执行一段时间以完成循环,然后在循环过程中随机失败,出现以下错误: System.Runtime.InteropServices.COMException(0x80080005):正在检索 由于错误,CLSID为{xxx}的组件的COM类因子失败 以下错误:80080005服务器执行失败[来自的异常] HRESULT:0x80080005(协同服务器故障) 我已检查了
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-感谢您的建议。以前没有注意到,但在阅读您的评论并思考之后,这是很明显的。请立即尝试。