La réponse à votre question a été abordé ici, je pense: How to properly clean up excel interop objects in c
je ne peux pas voir à partir de votre exemple de code, mais fondamentalement, Assignez toujours votre excelle les objets en variables locales, sans jamais aller «deux points vers le bas», comme ceci:
//FAIL
Workbook wkBook = xlApp.Workbooks.Open(@"C:\mybook.xls");
ref au lieu chaque obj individuellement:
//WIN
Worksheets sheets = xlApp.Worksheets;
Worksheet sheet = sheets.Open(@"C:\mybook.xls");
...
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(sheet);
.NET crée une enveloppe pour l'objet COM qui est invisible pour vous et n'est pas libéré jusqu'à ce que le GC tisse sa magie. Jusqu'à ce que je découvre cela, j'exécutais le code hacky ci-dessous dans une application ASP.NET chaque fois que je créais un nouveau classeur qui vérifie l'ancienneté du processus excel.exe et tue tous ceux qui datent de plus d'une minute:
//force kill any excel processes over one minute old.
try
{
Process[] procs = Process.GetProcessesByName("EXCEL");
foreach (Process p in procs)
{
if (p.StartTime.AddMinutes(1) < DateTime.Now)
{
p.Kill();
}
}
}
catch (Exception)
{}
Merci pour le pointeur vers l'autre question. Ils semblent traiter le même problème. –