Vous pouvez réellement version de votre Application Excel objet proprement, mais vous ne devez prendre soin.
Les conseils pour maintenir un nom de référence pour absolument tous les objets COM vous permet d'accéder et ensuite libérer explicitement par le Maréchal.FinalReleaseComObject() est correct en théorie, mais, malheureusement, très difficile à gérer dans la pratique. Si jamais se glisse n'importe où et utilise des "deux points", ou itère cellules via une boucle for each, ou tout autre type de commande, puis vous aurez non référencées objets COM et le risque d'un blocage. Dans ce cas, il n'y aurait pas moyen de trouver la cause dans le code, et vous auriez à passer en revue toutes vos code par l'oeil et j'espère trouver la cause, une tâche qui pourrait être à peu près impossible pour un grand projet.
La bonne nouvelle est que vous n'avez pas réellement avoir à maintenir un nom de variable de référence pour chaque objet COM que vous utilisez. Au lieu de cela, appelez le GC.Collect() et puis GC.WaitForPendingFinalizers() pour libérer l'ensemble de l' (souvent mineurs) des objets dont vous ne détenez pas une référence, puis relâchez explicitement les objets pour lesquels vous détenez un nom de variable de référence.
Vous devriez également communiquer vos nommé références dans l'ordre inverse d'importance: les objets range d'abord, puis des feuilles de calcul, des classeurs, et puis, finalement, votre Application Excel objet.
Par exemple, en supposant que vous avez un objet de la Plage variable nommée "xlRng", une Feuille de calcul variable nommée "xlSheet", un Classeur variable nommée "xlBook" et une Application Excel variable nommée "xlApp", puis votre code de nettoyage pourrait ressembler à quelque chose comme ce qui suit:
// Cleanup
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.FinalReleaseComObject(xlRng);
Marshal.FinalReleaseComObject(xlSheet);
xlBook.Close(Type.Missing, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(xlBook);
xlApp.Quit();
Marshal.FinalReleaseComObject(xlApp);
Dans la plupart des exemples de code que vous allez voir pour le nettoyage des objets COM .NET, le GC.Collect() et GC.WaitForPendingFinalizers() les appels sont effectués deux fois dans:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Cela ne devrait pas être nécessaire, cependant, sauf si vous utilisez Visual Studio Tools pour Office (VSTO), qui utilise les finaliseurs qui cause l'ensemble d'un graphe d'objets pour être promu dans la file d'attente de finalisation. De tels objets ne seraient pas libérés jusqu'à ce que la prochaine collecte des ordures. Toutefois, si vous n'êtes pas à l'aide de VSTO, vous devriez être en mesure d'appeler GC.Collect() et GC.WaitForPendingFinalizers() une seule fois.
Je sais que l'appelant explicitement GC.Collect() n'est pas (et certainement de faire deux fois les sons très douloureux), mais il n'y a pas moyen de contourner cela, pour être honnête. Par le biais de l'exploitation normale, vous allez générer des objets cachés dont vous détenez pas de référence que vous avez, par conséquent, ne peut pas par tout moyen autre que l'appel de GC.Collect().
C'est un sujet complexe, mais c'est vraiment tout là est à lui. Une fois que vous établissez ce modèle pour votre procédure de nettoyage, vous pouvez code normalement, sans la nécessité pour les emballages, etc. :-)
J'ai un tutoriel sur ce sujet ici:
L'automatisation des Programmes Office avec VB.Net / COM Interop
Il est écrit pour les VB.NET mais ne soyez pas rebutés par cela, les principes sont exactement les mêmes que lors de l'utilisation de C#.