<p>La clé est de libérer CHAQUE objet COM que vous créez, dans l’ordre inverse de création :</p>
<pre data-code-wrap="csharp"><code class="lang-csharp">// Libérer dans l'ordre inverse
Marshal.ReleaseComObject(range);
Marshal.ReleaseComObject(worksheet);
workbook.Close(false);
Marshal.ReleaseComObject(workbook);
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
// Forcer le ramasse-miettes
GC.Collect();
GC.WaitForPendingFinalizers();
</code></pre>
<p>Règle importante : n’utilisez jamais deux points dans un seul appel COM (par exemple <code>excelApp.Workbooks.Open(...)</code> crée un objet Workbooks implicite que vous ne pouvez pas libérer).</p>