2010-01-13 48 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);行。