sto lavorando a un'applicazione win # C# visual studio 2008. l'app parla di file excel e sto usando Microsoft.Office.Interop.Excel;
per farlo.Disporre in modo sicuro oggetti di interoperabilità di Excel in C#?
mi piacerebbe sapere come posso essere sicuro che gli oggetti vengano rilasciati anche quando c'è un errore?
ecco il mio codice:
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();
}
}
come posso fare in modo che, anche se ottengo un errore dopo la cartella di lavoro aperto, che faccio in modo di disporre gli oggetti:
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;
In altre parole, non importa quello che ho bisogno delle seguenti righe per eseguire
xlWorkBook.Close(true, null, null);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);
si prega di notare che ho provato questo come pure, con conseguente nello stesso numero
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);
e ho fatto anche questo:
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);
a questo punto non credo che sia possibile chiudere Excel da Visual Studio 2008. deve essere un bug o qualcosa del genere, ma ho provato i primi 20 siti web su questo e ottenendo lo stesso risultato: excel sta aprendo due istanze per qualche motivo e quando faccio la garbage collection ecc. (o meno) si chiude solo UN'istanza.
quando provo ad aprire il file, si dice che c'è un errore o è corrotto.
quando vado a task manager e uccidere il processo di Excel, il file verrà aperto senza problemi.]
c'è un modo per chiudere Excel con Visual Studio 2008? in tal caso, può fornirmi una guida o una soluzione per questo
Non chiamare GC.Collection() ... http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx –
puoi dirmi la differenza tra ciò che è succede con xlworkbook.close e xlapp.quit vs releaseObject? perché ho bisogno di entrambi? –
[Questo] (http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c/159419#159419) risponde bene alla tua domanda. –