Ich arbeite an einer winforms C# Visual Studio 2008 Anwendung. Die App spricht mit Excel-Dateien und ich verwende Microsoft.Office.Interop.Excel;
, um dies zu tun.Excel-Interop-Objekte in C# sicher entsorgen?
ich würde gerne wissen, wie kann ich sicherstellen, dass die objekte freigegeben werden, auch wenn es einen fehler gibt?
hier ist mein Code:
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();
}
}
, wie ich sicherstellen kann, dass selbst wenn ich einen Fehler nach dem Öffnen der Arbeitsmappe erhalten, dass ich sicher, der Gegenstände zu entsorgen:
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;
In Mit anderen Worten, egal, was ich brauche die folgenden Zeilen zu laufen
Bitte beachten Sie, dass ich dies versucht habe Auch in der gleichen Ausgabe resultierende
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);
und ich tat dies auch:
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);
an dieser Stelle Ich glaube nicht, es ist möglich, von Visual Studio zu schließen Excel 2008 es sein muss, Fehler oder etwas, aber ich habe versucht, die Top-20-Websites auf diesem und das gleiche Ergebnis: Excel öffnet zwei Instanzen aus irgendeinem Grund und wenn ich die Garbage Collection usw. tun. (oder nicht) es schließt nur eine Instanz.
Wenn ich versuche, die Datei zu öffnen, wird ein Fehler angezeigt oder sie ist beschädigt.
, wenn ich auf dem Task-Manager gehen und den Excel-Prozess beenden, wird die Datei ohne Probleme zu öffnen.]
ist es eine Möglichkeit, mit Visual Studio 2008 übertreffen zu schließen? Wenn ja, können Sie mir bitte eine Anleitung oder eine Lösung zu diesem
Rufen Sie nicht GC.Collection() ... http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx –
können Sie mir bitte sagen, der Unterschied zwischen was ist passiert mit xlworkbook.close und xlapp.quit vs ReleaseObject? Warum brauche ich beides? –
[This] (http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c/159419#159419) beantwortet Ihre Frage schön. –