É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
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
Vous devez vous connecter pour publier un commentaire.
D'abord je vais vous présenter une modification de la
releaseObject
, et puis je vais vous fournir un modèle pour l'utiliser.Maintenant, un modèle à utiliser:
Cette simple approche peut être étendue/imbriqués sur la plupart des situations. J'utilise un wrapper personnalisé classe qui implémente IDisposable pour rendre cette tâche plus facile.
veuillez noter que j'utilise .net 3.5
J'__ Oui, en C#
ref
ne peut être utilisé avec variables. Dans mes projets, j'ai deux "releaseObject" méthodes. On utiliseref
(je l'utilise pour tous les variables) et une autre qui n'utilise pas de "ref" (je l'utilise rarement pour certains propriétés). Si "ref" est pas utilisé puis il suffit de savoir que vous ne pouvez pas modifier la valeur qui a été passé, en l'appelant. E. g.realeaseObject(ref variable)
oureleaseObjectNonRef(Property); Property = null;
est nécessaire.j'ai fait le faire compilé par le retrait de la REF
mon application a ouvert deux instances de EXCEL.exe et je vois toujours ces 2 cas dans la barre des tâches, le code que tu fournis ne pas les fermer
OriginalL'auteur
Vérifier qu'il y a deux problèmes que vous voyez dans votre code:
erreur dans Excel indiquant que le fichier est corrompu ou une telle
J'ai copié le button1 cliquez sur gestionnaire de la tvp et de l'
releaseObject
méthode dans votre édité question dans un récipient propre VS2008, C#3.5 application Winform et fait quelques modifications mineures afin d'éliminer les problèmes que j'ai énumérés ci-dessus.De fixer Excel pas de déchargement de la mémoire, l'appel
releaseObject
sur lerange
objet que vous avez créé. De le faire avant votre appel àreleaseObject(xlWorkSheet);
Souvenir de toutes ces références, c'est ce qui rend l'Interopérabilité COM programmation beaucoup de plaisir.Pour réparer corrompu fichier Excel problème de mise à jour de votre
WorkBook.SaveAs
appel de la méthode pour remplacer le deuxième paramètre (Excel.XlFileFormat.xlXMLSpreadsheet
) avecType.Missing
. LeSaveAs
méthode va gérer cela correctement par défaut.Je suis sûr que le code que vous avez posté votre question est simplifié pour aider à résoudre les problèmes que vous rencontrez. Vous devez utiliser le
try..finally
bloc pst montre.|_ Pas sûr que je comprends - j'ai le xml spécification du format de votre code, à partir de la
xlWorkBook.SaveAs
appel de méthode. Je suggère de ne pas faire cela en utilisantType.Missing
à sa place.je suis désolé, je voulais dire que je voulais l'enregistrer exactlty le même format que est
|_ Je ne suis pas sûr de savoir comment vous feriez cela. Il y a un fichier Excel
Workbook.FileFormat
propriété vous pouvez récupérer la valeur d', et sans doute utiliser lorsque vousSaveAs
le nouveau fichier.OriginalL'auteur Jay Riggs