【发布时间】:2012-06-20 04:17:38
【问题描述】:
我正在开发一个 winforms c# visual studio 2008 应用程序。该应用程序与 excel 文件对话,我正在使用 Microsoft.Office.Interop.Excel; 来执行此操作。
我想知道如何确保即使出现错误也释放对象?
这是我的代码:
private void button1_Click(object sender, EventArgs e)
{
string myBigFile="";
OpenFileDialog openFileDialog1 = new OpenFileDialog();
DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
if (result == DialogResult.OK) // Test result.
myBigFile=openFileDialog1.FileName;
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;
string str;
int rCnt = 0;
int cCnt = 0;
xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Open(myBigFile, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", true, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
range = xlWorkSheet.UsedRange;
/*
for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
{
for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
{
str = (string)(range.Cells[rCnt, cCnt] as Excel.Range).Value2;
MessageBox.Show(str);
}
}
*/
xlWorkSheet..EntireRow.Delete(Excel.XLDirection.xlUp)
xlWorkBook.SaveAs(xlWorkBook.Path + @"\XMLCopy.xls", Excel.XlFileFormat.xlXMLSpreadsheet, Type.Missing, Type.Missing,
false, false, Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.Close(true, null, null);
xlApp.Quit();
releaseObject(xlWorkSheet);
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("Unable to release the Object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
我如何确保即使在打开工作簿后出现错误,我也要确保处置对象:
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;
换句话说,无论我需要以下几行来运行
xlWorkBook.Close(true, null, null);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);
请注意,我也试过这个,导致同样的问题
xlWorkBook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
xlApp.Quit();
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(xlApp);
xlWorkSheet = null;
xlWorkBook = null;
xlApp = null;
GC.GetTotalMemory(false);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.GetTotalMemory(true);
我也这样做了:
GC.Collect() ;
GC.WaitForPendingFinalizers();
GC.Collect() ;
GC.WaitForPendingFinalizers();
Marshal.FinalReleaseComObject(xlWorkSheet);
xlWorkBook.Close(Type.Missing, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(xlWorkBook);
xlApp.Quit();
Marshal.FinalReleaseComObject(xlApp);
在这一点上,我认为不可能从 Visual Studio 2008 中关闭 excel。它一定是一个错误或什么的,但我已经尝试了前 20 个网站并得到了相同的结果:excel 正在打开两个实例出于某种原因,当我进行垃圾收集等时。(或不)它只关闭一个实例。
当我尝试打开文件时,它说有错误或已损坏。
当我去任务管理器并杀死excel进程时,文件将毫无问题地打开。]
有没有办法用 Visual Studio 2008 关闭 excel?如果是这样,请您为我提供指导或解决方案
【问题讨论】:
-
不要调用 GC.Collection()...blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx
-
您能告诉我 xlworkbook.close 和 xlapp.quit 与 releaseObject 之间的区别吗?为什么我需要这两个?
-
This 很好地回答了你的问题。
-
@JayRiggs 但 erik 明确表示不要使用 gc.collect
-
@ErikPhilips jay 引用了有人说要使用 gc.collection 两次!
标签: c# excel interop dispose excel-interop