1、 释放office excel 进程
方法一、在同一方法内部调用GC
将用到的office 所有对象(到最小对象单元,除了应用程序对象) 引用设为null ,,调用应程序对象引用的Quit() 方法,再将应用程序对象引用置为null ,最后调用GC.Collect() 。如果最后不将应用程序的对象引用置为null ,那么进程中会至少有一个该office 对象进程。
using MSExcel= Microsoft.Office.Interop.Excel;
Public void ReleaseProcess()
{
MSExcel.Application excelApplicstion = new MSExcel.Application ();
MSExcel.Workbooks workBooks = excelApplicstion.Workbooks;
workBooks.Open(@"E:/test2.xls" );
MSExcel.Workbook workBook = null ;
MSExcel.Sheets workSheets;
if (workBooks.Count>0)
{
workBook = workBooks[1];
}
if (workBook.Worksheets.Count > 0)
{
workSheets = workBook.Worksheets;
}
workSheets = null;
workBook = null;
workBooks = null;
excelApplicstion.Quit();
System.Runtime.InteropServices.Marshal .ReleaseComObject(excelApplicstion);// 不调用也可以
excelApplicstion = null;
GC.Collect();
}
方法二、在调用方法中释放被调用方法内的Office 进程,在被调用方法内部至少要调用应用程序对象引用的Quit() 方法。
Public void CreatePrecess()
{
MSExcel.Application excelApplicstion = new MSExcel.Application ();
MSExcel.Workbooks workBooks = excelApplicstion.Workbooks;
workBooks.Open(@"E:/test2.xls" );
MSExcel.Workbook workBook = null ;
MSExcel.Sheets workSheets;
if (workBooks.Count>0)
{
workBook = workBooks[1];
}
if (workBook.Worksheets.Count > 0)
{
workSheets = workBook.Worksheets;
}
excelApplicstion.Quit();
System.Runtime.InteropServices.Marshal .ReleaseComObject(excelApplicstion)// 不调用也可以
excelApplicstion = null ;// 此时不赋null 也可以
//GC.Collect(); 如果在这里调用,进程不会释放资源
}
}
Public void ReleaseProcess()
{
CreateProcess();
GC.Collect();
}
方法三、对每个对象引用调用 Marshal .ReleaseComObject 方法。在同一个方法内部调用GC.Collect 时,也必须对office 的所有对象引用调用Marshal .ReleaseComObject ,否则进程中至少会有一个office 进程。但是如果在外部调用GC.Collect 时,可不必对所有对象引用调用Marshal .ReleaseComObject ,但必须对应用程序的对象引用调用Quit() 方法。
Public void ReleaseObjects()
{
MSExcel.Application excelApplicstion = new MSExcel.Application ();
MSExcel.Workbooks workBooks = excelApplicstion.Workbooks;
workBooks.Open(@"E:/test2.xls" );
MSExcel.Workbook workBook = null ;
MSExcel.Sheets workSheets = null ;
if (workBooks.Count > 0)
{
workBook = workBooks[1];
}
if (workBook.Worksheets.Count > 0)
{
workSheets = workBook.Worksheets;
}
if (workSheets != null )
Marshal .ReleaseComObject(workSheets);
if (workBook != null )
{
workBook.Close(false , System.Reflection.Missing .Value, System.Reflection.Missing .Value);
Marshal .ReleaseComObject(workBook);
}
if (workBooks != null )
Marshal .ReleaseComObject(workBooks);
if (excelApplicstion != null )
{
excelApplicstion.Quit();// 外部调用GC 时必须的,内部调用时可不写
Marshal .ReleaseComObject(excelApplicstion);
}
GC .Collect();
}