2010-01-13 47 views
3

我在下面的內部應用程序中有拼寫檢查的方法。作爲一個新的程序員,它通過多種渠道拼湊起來並進行調整,直到它爲我工作。正確的互操作清理

隨着我的成長和學習,我遇到了讓我走的事情,嗯。像這個SO帖子,How to properly clean up Excel interop objects in C#,談論正確的互操作清理。

我注意到它反覆提到使用Marshal.FinalReleaseComObject()Marshal.ReleaseComObject()

我的問題是基於下面的代碼我也需要這個呢?謝謝

 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; 
    } 

回答

2

我會說絕對。您應該始終使用Marshal.ReleaseComObject來清理.NET代碼中的非託管COM引用。

+0

所以我會考慮添加這3行? '對Marshal.ReleaseComObject(DOC); Marshal.ReleaseComObject(app); Marshal.ReleaseComObject(errors);' – 2010-01-13 19:44:14

+0

是的,我會說應該照顧它。你需要確保你在try中包裝現有代碼... finally塊並釋放finally塊中的COM對象,以確保它們實際上得到清理。 – 2010-01-13 20:22:34

+0

謝謝!最後的澄清,我也會自己研究它,我是否也需要'Marshal.FinalReleaseComObject()'?我不確定這種不同之處在哪裏。 – 2010-01-13 20:34:27

1

您還應該顯式創建和釋放中間對象。在Word._Document doc = app.Documents.Add(...);的情況下,您隱式創建需要發佈的_Documents對象。你應該打破它分爲兩線:

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

它通常被稱爲兩點統治。任何時候,COM互操作代碼中都有兩個點,您可能需要將其分解出來,因此相同的規則適用於doc.Words.First.InsertBefore(text);行。