Regasm записывает mscoree.dll в ключ реестра InprocServer32

Когда я регистрирую свою сборку .NET с помощью regasm.exe, ключ реестра

HKEY_CLASSES_ROOT \ CLSID {111E32AD-4BF8-495F-AB4D-6C61BD463EA4} \ InprocServer32

установлен на "mscoree.dll".

Однако я пытаюсь имитировать существующий COM-сервер, написанный на C. При регистрации этого старого COM-сервера InprocServer32 устанавливается на полный путь к этому компоненту.

К сожалению, существующая система (хост плагина, который я не могу изменить) читает и использует это значение - его смущает значение "mscoree.dll".

Моим решением могло бы быть исправление этой записи реестра вручную, но я хотел бы понять, почему regasm записывает "mscoree.dll" в InprocServer32.


person Stiefel    schedule 28.05.2010    source источник


Ответы (1)


Объяснение довольно простое. Когда вы используете собственный (неуправляемый) COM-сервер в процессе, он загружается в процесс-потребитель, и процесс-потребитель напрямую вызывает его функции.

Это не может работать так просто с управляемой кодовой сборкой, доступной через COM. В случае управляемого кода необходим промежуточный уровень, который выполняет управляемое / неуправляемое взаимодействие. mscoree.dll действует как промежуточный слой. Поэтому, когда потребитель вызывает, CoCreateInstance() mscoree.dll загружается и эмулирует COM-сервер, загружая управляемый код сборки, доступный для COM, и перенаправляет все вызовы последнему.

person sharptooth    schedule 31.05.2010