#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 было в лучшем случае щекотливым