Когда я регистрирую свой блок.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.
Объяснение довольно простое. Когда вы используете собственный (неуправляемый) COM-сервер в процессе, он загружается в процесс-потребитель, и процесс-потребитель напрямую вызывает его функции.
Это не может работать так просто с управляемой кодовой сборкой, доступной через COM. В случае управляемого кода необходим промежуточный уровень, который выполняет управляемое / неуправляемое взаимодействие. mscoree.dll
действует как этот промежуточный уровень. Поэтому, когда потребитель вызывает CoCreateInstance (),
загружается mscoree.dll
, который эмулирует COM-сервер, загружая управляемый код сборки, доступный для COM, и перенаправляет все вызовы последнему.