Я перефразировал этот вопрос.
Когда объекты .net открываются для COM-клиентов через COM iterop, создается CCW ( COM Callable Wrapper ), который располагается между COM-клиентом и объектом Managed .net.
В мире COM объекты хранят количество ссылок, которые другие объекты имеют к нему. Объекты удаляются / освобождаются / собираются, когда счетчик ссылок обращается в ноль Это означает, что завершение COM-объекта является детерминированным (мы используем Using / IDispose в .net для детерминированного завершения, финализаторы объектов не являются детерминированными).
Каждый CCW является COM-объектом, и он подсчитывается как любой другой COM-объект. Когда CCW умирает (счетчик ссылок становится равным нулю), GC не сможет найти объект CLR, завернутый в CCW, и объект CLR пригоден для сбора. Счастливые дни, все хорошо с миром.
То, что я хотел бы сделать, это перехватить, когда CCW умирает (то есть, когда его счетчик ссылок становится равным нулю), и каким-то образом сообщить об этом объекту CLR (например, вызвав метод Dispose для управляемого объекта).
Итак, можно ли узнать, когда счетчик ссылок COM Callable Wrapper для класса CLR становится равным нулю?
и / или
Можно ли предоставить мою реализацию AddRef & ReleaseRef для CCW в .net?
Если нет альтернативы, это реализовать эти библиотеки в ATL (мне не нужна помощь с ATL, спасибо). Это не было бы ракетостроением, но я не хотел бы этого делать, потому что я единственный разработчик, работающий с любым реальным миром C ++ или любым ATL.
Фон
Я переписываю некоторые старые библиотеки ActiveX VB6 в .net (точнее, C #, но это скорее проблема взаимодействия .net / COM, а не проблема C #). Некоторые из старых объектов VB6 зависят от подсчета ссылок для выполнения действий, когда объект завершается (см. Объяснение подсчета ссылок выше). Эти библиотеки DLL не содержат важной бизнес-логики, они являются утилитами и вспомогательными функциями, которые мы предоставляем клиентам, которые интегрируются с нами с помощью VBScript.
Что я не пытаюсь сделать
- Вместо этого количество ссылок .net объектов
использования сборщика мусора.
Я вполне доволен GC, мой
проблема не с GC.
- Использовать финализаторы объектов. Финализаторы
недетерминированный, в этом случае я
нужно детерминированное прекращение (как
Использование / IDispose идиома в .net)
- Реализация IUnknown в неуправляемом C ++
Если я пойду по маршруту C ++, я буду использовать
ATL, спасибо.
- Решите это, используя Vb6, или повторно используя
VB6 объекты. Весь смысл
это упражнение состоит в том, чтобы удалить нашу сборку
зависимость от Vb6.
Спасибо
BW
Принятый ответ
Огромное спасибо Стиву Штейнеру , который предложил единственный (возможно, работоспособный) ответ на основе .net, и Earwicker , который предложил очень простое решение ATL.
Однако принятый ответ идет на Bigtoe , который предлагает обернуть объекты .net в объекты VbScript (что я не считал честным), эффективно предоставляя простое решение VbScript для проблемы VbScript.
Спасибо всем.