2016-01-23 7 views
0

Я использую сторонние объекты C++ COM, которые, как представляется, содержат несколько статических элементов. Дело в том, что я должен перезапускать статические элементы каждый раз, когда начинаю новый прогон. Поэтому мне сейчас нужно закрыть и открыть приложение. Я попытался использовать AppDomain для разгрузки всей памяти этих статических членов, но я понятия не имею, почему это не сработает. Я растеризовать COM-объект, используя Activator.CreateInstance(Type.GetTypeByCLSID), есть ли что-нибудь, что мне нужно сделать вручную, чтобы уничтожить эти экземпляры? обратите внимание, что я проверил, и любые статические объекты C# распоряжаются этим способом.Разгрузка appdomain не очищает C++ COM-объект статические члены

ответ

2

неуправляемые ресурсы называются неуправляемого потому, что их память не обрабатывается удалось сборщика мусора.

Любой неуправляемый ресурс должен быть вручную удален. Это одна из целей (если не самая важная) IDisposable: ее реализации имеют некоторый связанный неуправляемый ресурс. Например, FileStream необходимо удалить вручную, поскольку это оболочка вызовов Win32 API.

Таким образом, выгрузка AppDomain или любого другого подхода здесь не поможет. Те, кому нужно кодировать, чтобы избавляться от этих статических ресурсов COM, когда вам они больше не нужны (i.e при закрытии приложения).

+1

Как я могу закрыть статический ресурс объекта COM, не убивая приложение? будет ли 'Marshal.ReleaseComObject' выполнять эту работу? –

+0

@maordavid На самом деле я не эксперт по interop, поэтому у меня нет четкого ответа на этот другой вопрос. BTW, вы можете быть уверены, что любой неуправляемый ресурс должен быть вручную удален вами в вашем коде приложения ... –

+0

@maordavid Также вполне возможно, что эти сторонние COM-компоненты были неправильно реализованы ... они должны обеспечить некоторый способ повторной инициализации их незарегистрированные ресурсы или кто знает, что ... –

Смежные вопросы