Éliminer sans danger Excel interopérabilité des objets en C#?

je suis en train de travailler sur un winforms en c# visual studio 2008 de l'application. l'application des pourparlers de fichiers excel et je suis en utilisant Microsoft.Office.Interop.Excel; pour ce faire.

je voudrais savoir comment puis-je m'assurer que les objets sont libérés, même quand il ya une erreur?

voici mon 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();
}
}

comment puis-je m'assurer que, même si je reçois un message d'erreur après le classeur ouvert, que j'ai assurez-vous de disposer des objets:

Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;

En d'autres mots, peu importe ce que j'ai besoin de l'lignes suivantes à exécuter

xlWorkBook.Close(true, null, null);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);

veuillez noter que j'ai essayé ce que, dans le même numéro

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);  

et je l'ai fait ainsi:

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); 

à ce point, je ne pense pas que c'est possible de fermer excel à partir de visual studio 2008. il doit être un bug ou quelque chose, mais j'ai essayé de le top 20 des sites web sur ce et d'obtenir le même résultat: excel est l'ouverture de deux cas pour une raison quelconque, et quand je fais de la collecte des déchets, etc.. (ou pas), il se ferme juste UN exemple.

lorsque j'essaie d'ouvrir le fichier, il dit qu'il y a une erreur ou il est corrompu.

lorsque je vais dans le gestionnaire des tâches et tuer le processus excel, le fichier s'ouvre sans problèmes.]

est-il un moyen de fermer excel avec visual studio 2008? si oui, pouvez-vous svp me donner des conseils ou une solution à ce

Ne pas appeler GC.Collection()... blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx
pouvez-vous me dire la différence entre ce qui se passe avec xlworkbook.fermer et xlapp.arrêter de vs le releaseObject ? pourquoi ai-je besoin à la fois de ceux-ci?
This les réponses à votre question bien.
mais erik dit expressément de ne pas utiliser gc.recueillir
jay cité quelqu'un qui dit d'utiliser gc.collection deux fois!

OriginalL'auteur l--''''''---------'''''''''''' | 2012-04-01