2010-01-13 5 views
3

J'ai la méthode ci-dessous pour l'orthographe dans mon application interne. En tant que nouveau programmeur, cela a été reconstitué à travers plusieurs sources et ajusté jusqu'à ce qu'il fonctionne pour moi. En grandissant et en apprenant, je tombe sur des choses qui me font partir, hmm. Comme ce post SO, How to properly clean up Excel interop objects in C#, qui parle de nettoyage Interop approprié. J'ai noté qu'il mentionne à plusieurs reprises l'utilisation de Marshal.FinalReleaseComObject() ou Marshal.ReleaseComObject().Propre nettoyage Interop

Ma question est la suivante, en fonction du code ci-dessous ai-je besoin aussi? Merci

 public string CheckSpelling(string text) 
    { 
     Word.Application app = new Word.Application(); 
     object nullobj = Missing.Value; 
     object template = Missing.Value; 
     object newTemplate = Missing.Value; 
     object documentType = Missing.Value; 
     object visible = false; 
     object optional = Missing.Value; 
     object savechanges = false; 
     app.ShowMe(); 

     Word._Document doc = app.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible); 

     doc.Words.First.InsertBefore(text); 
     Word.ProofreadingErrors errors = doc.SpellingErrors; 

     var ecount = errors.Count; 
     doc.CheckSpelling(ref optional, ref optional, ref optional, ref optional, 
      ref optional, ref optional, ref optional, ref optional, ref optional, 
      ref optional, ref optional, ref optional); 
     object first = 0; 
     object last = doc.Characters.Count - 1; 
     var results = doc.Range(ref first, ref last).Text; 
     doc.Close(ref savechanges, ref nullobj, ref nullobj); 
     app.Quit(ref savechanges, ref nullobj, ref nullobj); 

     return results; 
    } 

Répondre

2

Je dirais certainement. Vous devriez toujours utiliser Marshal.ReleaseComObject pour nettoyer les références COM non managées dans le code .NET.

+0

Donc je chercherais à ajouter ces 3 lignes? 'Marshal.ReleaseComObject (doc); Marshal.ReleaseComObject (app); Marshal.ReleaseComObject (erreurs); ' –

+0

Oui, je dirais que cela devrait prendre soin d'elle. Vous voudrez vous assurer que vous enveloppez le code existant dans un try ... enfin bloquer et libérer les objets COM dans le bloc finally pour s'assurer qu'ils sont effectivement nettoyés. –

+0

Merci! Dernière précision, et j'y reviendrai moi aussi, n'ai-je pas besoin de Marshal.FinalReleaseComObject() '? Je ne sais pas comment cela diffère est al. –

1

Vous devez également créer et libérer explicitement des objets intermédiaires. Dans le cas de Word._Document doc = app.Documents.Add(...);, vous créez implicitement un objet _Documents qui doit être libéré. Vous devriez le casser en deux lignes:

Word._Documents docs = app.Documents; 
Word._Document doc = docs.Add(...); 
// release docs and doc after use 

Il est souvent appelé les deux points règle. Chaque fois qu'il y a deux points dans le code d'intercom COM, vous devez probablement le décomposer, donc la même règle s'appliquera à la ligne doc.Words.First.InsertBefore(text);.