Правильное взаимодействие очистки - PullRequest
3 голосов
/ 13 января 2010

У меня есть метод проверки правописания ниже в моем приложении в доме. Как новый программист, он был собран из нескольких источников и изменен, пока он не сработал для меня.

Когда я расту и учусь, я сталкиваюсь с вещами, которые заставляют меня идти, хм. Как и этот пост, Как правильно очистить объекты взаимодействия Excel в 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 ]

2 голосов
/ 13 января 2010

Я бы сказал определенно.Вы всегда должны использовать Marshal.ReleaseComObject для очистки неуправляемых ссылок COM в коде .NET.

1 голос
/ 07 декабря 2012

Вы также должны явно создавать и освобождать промежуточные объекты. В случае 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); строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...