Установка на ноль определенно недостаточно. В этом случае, кроме того, вы должны заставить сборщик мусора провести кучу как можно скорее. Вы делаете это правильно с вызовами на GC.Collect()
и GC.WaitForPendingFinalizers()
. Вызов дважды безопасен, завершение гарантирует, что циклы также будут очищены.
Но я бы порекомендовал использовать System.Runtime.InteropServices.Marshal.ReleaseComObject
для освобождения объекта Outlook, когда вы закончили его использовать. Затем установите переменную Nothing
в Visual Basi c (null
в C#), чтобы освободить ссылку на объект. Это особенно важно, если ваша надстройка пытается перечислить более 256 элементов Outlook в коллекции, которая хранится на сервере Microsoft Exchange (это число было увеличено в последних версиях). Если вы не освободите эти объекты своевременно, вы можете достичь предела, наложенного Exchange на максимальное количество элементов, открытых одновременно.
Метод ReleaseComObject
используется для явного управления временем жизни COM-объекта, используемого из управляемого кода. Этот метод следует использовать для освобождения базового COM-объекта, который своевременно хранит ссылки на ресурсы или когда объекты должны быть освобождены в определенном порядке c.
Каждый раз, когда указатель интерфейса COM входит в общий язык время выполнения (CLR), оно заключено в RCW.
RCW имеет счетчик ссылок, который увеличивается каждый раз, когда указатель COM-интерфейса сопоставляется с ним. Метод ReleaseComObject
уменьшает счетчик ссылок RCW. Когда счетчик ссылок достигает нуля, среда выполнения освобождает все свои ссылки на неуправляемом COM-объекте и выдает System.NullReferenceException
, если вы пытаетесь использовать объект дальше. Если один и тот же интерфейс COM передается из неуправляемого кода в управляемый более одного раза, счетчик ссылок в оболочке увеличивается каждый раз, а вызов ReleaseComObject возвращает количество оставшихся ссылок.
Метод ReleaseComObject
включает заставить принудительно сбросить счетчик ссылок RCW, чтобы он происходил именно тогда, когда вы этого хотите. Однако неправильное использование ReleaseComObject
может привести к сбою приложения или нарушению доступа.