Когда мне нужно вызвать Marshal.ReleaseComObject для интерфейса, запрошенного через COM в C#C#

Место общения программистов C#
Anonymous
Когда мне нужно вызвать Marshal.ReleaseComObject для интерфейса, запрошенного через COM в C#

Сообщение Anonymous »

Я работал с некоторыми интерфейсами DirectShow для воспроизведения цифрового телевидения (DVB-T) с использованием C# и DirectShow.Net. Недавно я столкнулся с ошибкой времени выполнения. COM-объект, который отделен от базового RCW, не может быть использован.

Эта ошибка произошла в следующей строке:

Код: Выделить всё

_guideData = _transportInformationFilter as IGuideData;

Код: Выделить всё

_transportInformationFilter
имеет тип IBaseFilter, COM-объект, ранее назначенный с помощью служебной функции DirectShow.Net.

Я предположил, что ошибка каким-то образом произошла из-за _transportInformationFilter был преждевременно выпущен, и я связал это со следующим методом (удалена обработка ошибок):

Код: Выделить всё

private void AttachGuideDataEvent()
{
IConnectionPoint connPoint = null;
IConnectionPointContainer connPointContainer = null;
try
{
connPointContainer = _transportInformationFilter as IConnectionPointContainer;
if (connPointContainer == null) /* error */

var guideDataEventGuid = typeof (IGuideDataEvent).GUID;
connPointContainer.FindConnectionPoint(ref guideDataEventGuid, out connPoint);
if (connPoint == null) /* error */

int cookie;
connPoint.Advise(this, out cookie);
if (cookie == 0) /* error */
_persistIGuideDataEventCookie = cookie;
}
finally
{
if (connPointContainer != null)
Marshal.ReleaseComObject(connPointContainer);
if (connPoint != null)
Marshal.ReleaseComObject(connPoint);
}
}
Насколько я понял, connPointContainer = _transportInformationFilter as IConnectionPointContainer должен был привести к вызову QueryInterface для COM-объекта _transportInformationFilter , и поэтому его нужно будет выпускать отдельно. Однако вызов Marshal.ReleaseComObject(connPointContainer) стал причиной отделения _transportInformationFilter от его RCW; удаление этого вызова устранило проблему.

Учитывая это, в каких ситуациях мне необходимо явно освобождать COM-объекты (используя Marshal.ReleaseComObject) в C#, чтобы избежать утечки ресурсов?

Подробнее здесь: https://stackoverflow.com/questions/508 ... eried-thro

Вернуться в «C#»