Насколько мне известно, VB6 ActiveX EXE был, по сути, внепроцессным COM-сервером.
(Могут быть некоторые тонкости, которые означают, что это не совсем идентичные понятия, но я думаю, что это была основная идея).
Кажется, что существует несколько способов создания COM-серверов вне процесса из .NET. Этот другой вопрос имеет несколько хороших ответов .
Ниже приводится краткое изложение всех основных техник, о которых я читал.
[A] Один из подходов заключается в использовании «суррогатного» процесса для размещения DLL . Обратите внимание, что это похоже на методику перекрестных вызовов между 32-разрядными и 64-разрядными.
Из этой статьи Microsoft , описывающей один метод, ключевыми моментами являются:
Шаг 1. Создайте сборку .NET с COM-видимыми типами и
интерфейсы
Шаг 2. Зарегистрируйте сборку .NET для COM-взаимодействия
Шаг
3. Установите сборку .NET в GAC
Шаг 4. Настройте
Суррогатный процесс COM по умолчанию для вашей сборки
Шаг 5: Активируйте
COM-объект с использованием CLSCTX_LOCAL_SERVER
Я думаю, что его шаги 4 и 5 действительно являются ключами к этому методу.
[B1] Второй подход заключается в создании " COM EXE-сервера, полностью реализованного в управляемом коде " с помощью ...
полностью преобразовывает сборку .NET EXE в локальный сервер COM
выполнение всех требований такого сервера, как это предусмотрено
Спецификации COM.
В нем говорится, что выполнение этого отвечает следующим требованиям и показан пример:
Предоставление класса фабрики классов (который реализует COM
Интерфейс IClassFactory) для каждого класса .NET, который мы хотим экспортировать
на COM.
Правильно вставить записи реестра для сборки EXE,
включая ключ LocalServer32.
Правильно звонит
CoRegisterClassObject () и CoRevokeClassObject () на этих фабриках
классы.
[B2] Что-то вроде другой пример этого здесь . В нем говорится:
Пример демонстрирует внепроцессный COM-сервер в форме
локальный сервер (EXE), который полностью реализован в Visual C #.
Это может отличаться некоторыми техническими деталями (я действительно не оценивал, насколько принципиально это могло бы быть.)
[C] Возможно, другой подход состоит в том, чтобы «создавать компоненты COM + с использованием System.EnterpriseServices.ServicedComponent
» (что кратко описано в SO по этой ссылке 1083 *).