У меня есть COM-объект:Как освободить COM-объект с IConnectionPointContainer и IConnectionPoints правильно
_myObject = (IMyInterface)Activator.CreateInstance(...);
я могу получить IConnectionPointContainer:
_cpc = (IConnectionPointContainer)_myObject;
И получить мою IConnectionPoint из этого:
IConnectionPoint _cp;
_cpc.FindConnectionPoint(typeof(IMyCPInterface).GUID, out _cp);
_cp.Advise(this, out _cookie);
Я не уверен насчет правильного способа освобождения всех ресурсов сейчас. Как правильно освободить все созданные ресурсы?
На данный момент я это сделать, как показано ниже, но я не уверен, если я освободить все правильно:
protected virtual void Dispose(bool pDisposing)
{
if(!_isDisposed)
{
if(pDisposing)
{
//dispose managed
}
if(_cookie > 0 && _cp != null)
{
_cp.Unadvise(_cookie);
_cp = null; //<-- ReleaseComObject(_cp); ?
_cookie = 0;
}
//I don't release _cpc, because it is the same object as _myObject?
if(_myObject != null)
{
Marshal.ReleaseComObject(_myObject);
_myObject = null;
}
_isDisposed = true;
}
}
В общем: Release, как много раз в количество ссылок увеличивается. Т.е.: при запросе интерфейса (путем каста вроде: ((IConnectionPointContainer) _myObject), вы должны прочитать документ, чтобы определить, увеличивается ли количество ссылок (оно обычно есть). Marshal.FinalReleaseComObject может помочь: https: // msdn .microsoft.com/en-us/library/system.runtime.interopservices.marshal.finalreleasecomobject% 28v = vs.100% 29.aspx – Stefan
Согласно: https://msdn.microsoft.com/en-us/library/ windows/desktop/ms692476% 28v = vs.85% 29.aspx, _cp должен быть выпущен. _cpc также должен быть выпущен, и, конечно же, должен также быть выпущен _myObject, возможно, дважды из-за нажатия IMyInterface. – Stefan
Вы всегда можете его протестировать , ref-count должно быть 0, когда вы закончите с объектом. – Stefan