Как использовать службы автоматизации Office из управляемого кода (C#, Visual Basic, .NET)
Проблема
В Office используется технология COM для предоставления объектов автоматизации. В управляемом коде, например написанном на C# и Visual Basic, COM-объекты обертываются в вызываемые оболочки времени выполнения (RCW). Без специального действия со стороны программиста COM-объекты, обернутые в RCW, освобождаются только механизмом сборки мусора, который может и не запуститься, если нет большой потребности в свободной памяти.
Решение
Для детерминированного освобождения COM-объектов, освободите все ненужные больше объекты, полученные от Office, методом System.Runtime.InteropServices.Marshal.ReleaseComObject.
Примечание
-
Не используйте метод System.Runtime.InteropServices.Marshal.FinalReleaseComObject, поскольку это освободит COM-объект, даже если его еще используют другие управляемые надстройки.
-
Не обращайтесь к объекту посредством другого объекта, например:
// C# // Wrong PowerPoint.View view = Application.ActiveWindow.View;
' Visual Basic ' Wrong Dim view As PowerPoint.View = Application.ActiveWindow.View
В таком случае ActiveWindow создает временное PowerPoint.DocumentWindow, которое не будет освобождено.
Взамен, назначьте его переменной и освободите ее:
// C# PowerPoint.DocumentWindow wnd = Application.ActiveWindow; PowerPoint.View view = wnd.View; System.Runtime.InteropServices.Marshal.ReleaseComObject(wnd); System.Runtime.InteropServices.Marshal.ReleaseComObject(view);
' Visual Basic Dim wnd As PowerPoint.DocumentWindow = Application.ActiveWindow Dim view As PowerPoint.View = wnd.View System.Runtime.InteropServices.Marshal.ReleaseComObject(wnd) System.Runtime.InteropServices.Marshal.ReleaseComObject(view)