Compact Framework блокирует доступ к точкам подключения COM

#c# #com #garbage-collection #compact-framework

#c# #com #сбор мусора #compact-framework

Вопрос:

Я много искал в Google для этого, но, похоже, никто не говорит об этой проблеме.

У меня есть COM-компонент, написанный на C , который предоставляет события («точки подключения» на языке COM). Этот компонент (элемент управления map) уже несколько лет надежно используется клиентами, написанными на C и C # в Windows XP / 7. Он также надежно использовался в течение нескольких лет клиентами, написанными на C в Windows CE.

Однако точки подключения в Compact Framework не работают. Было одно устройство, на котором они работали, но на нескольких других устройствах (разные сборки WinCE) события самопроизвольно отписываются!

 MapControl _ctrl;
_IMapControlEvents_MouseEventEventHandler _temp;

public MapForm()
{
    InitializeComponent();
    _ctrl = new MapControl();
    _ctrl.MouseEvent  = (_temp = HandleMouseEvent);
    ...
}
...
 

Сначала HandleMouseEvent() вызывается _ctrl для каждого события мыши, но как только происходит сборка мусора, событие отписывается и HandleMouseEvent() больше не вызывается (я подтвердил, что событие отписано, отредактировав код ATL, чтобы напечатать «Подписчик удален».)

К сожалению, невозможно повторно подписаться. Например, если я использую такой код:

 _testTimer = new Timer();
_testTimer.Interval = 10000;
_testTimer.Enabled = true;
_testTimer.Tick  = (s, e) => {
    _ctrl.MouseEvent -= _temp;
    _ctrl.MouseEvent  = _temp;
};
 

Это работает до тех пор, пока нет сборки мусора. Но после первого GC _ctrl.MouseEvent -= _temp и _ctrl.MouseEvent = _temp оба выбрасывают InvalidComObjectException (0x80131527). Вы все еще можете вызывать методы _ctrl , но события не могут быть использованы.

Итак, кто-нибудь знает обходной путь для этой проблемы? (У кого-нибудь еще есть эта проблема?)

Версия: Windowscgacutil.exe Структура компактных отчетов [3.5.11125.0]

Комментарии:

1. Звучит некрасиво, и у меня нет решения, но вы можете добавить версию CF, с которой вы тестируете, вплоть до номера редакции. Это может иметь значение (а может и нет).

2. ОК. На самом деле, что действительно ужасно, так это то, что произойдет, если я попытаюсь использовать COM-объект в программе Compact Framework 2.0 на нашем основном целевом устройстве (Ranger 4). Я могу создать экземпляр и использовать COM-объект, без проблем, но после создания COM-объекта (даже если я ничего с ним не делаю) сотни или тысячи различных API в BCL начинают генерировать NotSupportedException при каждом их вызове. Диалоговое окно «Fatal Error», отображаемое самим CF, запускается NotSupportedException при нажатии Quit, вызывая другое диалоговое окно, поэтому процесс не завершается. Решение: сборка для .NET CF 3.5 вместо 2.0.

3. да, COM-взаимодействие в 2.0 было в лучшем случае щекотливым