适当的互操作清理

时间:2010-01-13 18:36:25

标签: c# .net interop ms-word

我在我的内部应用程序中使用以下方法进行拼写检查。作为一个新的程序员,这是通过多个来源拼凑在一起并进行调整,直到它对我有用。

随着我的成长和学习,我遇到了让我走的东西,嗯。就像这篇SO帖子How to properly clean up Excel interop objects in C#一样,它讨论了正确的Interop清理。

我注意到它反复提到使用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 个答案:

答案 0 :(得分:2)

我肯定会说。您应该始终使用Marshal.ReleaseComObject来清除.NET代码中的非托管COM引用。

答案 1 :(得分: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);行。