Неуправляемый дескриптор на С#, нужно ли освобождать или уничтожать?

У меня есть код С#, который используется в приложении win32 через ComInterop, он встроен в OleControl.

В моем приложении win32 я отправляю через дескриптор в содержащее окно для элемента управления С# (код приложения win32):

oControl:ShowPreview(5, 3, INT(_CAST, SELF:Handle(0)))

В моем коде С# я выбираю это и сохраняю его в IntPtr (код С#):

private IntPtr _parentWindowPtr;

public int ShowPreview(int someVar1, int someVar2, int parent)
{
 ...
 _parentWindowPtr = new IntPtr(parent);
 ...
}

Должен ли я выпускать или уничтожать IntPtr в коде С#?

1 ответ

Это резюме моего комментария выше

Должен ли я выпускать или уничтожать IntPtr в коде С#?

Проще говоря, вы не должны выпускать дескрипторы окон при работе с Ole/COM. Ole Controls/COM ActiveX можно рассматривать как абстракцию пользовательского интерфейса более высокого уровня (включая протоколы по протоколу IOleControl, IOleControlSite) над IOleControlSite окнами. Вместо того, чтобы выпустить дескрипторы окон, вы отпускаете ссылки COM, которые в конечном итоге приводят к разрушению окна и выпуску дескриптора.

В вашем конкретном случае вы проходите через дескриптор собственного окна в свой COM-элемент управления, чтобы внедрить его. Лучшая практика заключается в том, что вызывающий процесс (native exe) имеет право владения содержащим окном, и поэтому элемент управления COM не должен брать на себя, чтобы уничтожить контейнер.

Как выпустить COM-объект в С#

Напомним, что выпуск COM-объектов в лучшей практике С# состоит в следующем:

Marshal.ReleaseComObject(someComObject);

График Excel, встроенный в Microsoft Word, не берет на себя обязательство закрыть Word.

Расскажи мне больше

licensed under cc by-sa 3.0 with attribution.