我在我的内部应用程序中使用以下方法进行拼写检查。作为一个新的程序员,这是通过多个来源拼凑在一起并进行调整,直到它对我有用。
随着我的成长和学习,我遇到了让我走的东西,嗯。就像这篇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;
}
答案 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);
行。