当我使用regasm.exe注册我的.NET程序集时注册表项
HKEY_CLASSES_ROOT \ CLSID {111E32AD-4BF8-495F-AB4D-6C61BD463EA4} \ InprocServer32的
设置为“mscoree.dll”。
但是,我试图模仿用C编写的现有COM服务器。当注册这个旧的COM服务器时,InprocServer32被设置为该组件的完整路径。
不幸的是,现有系统(我无法更改的插件主机)读取并使用此值 - “mscoree.dll”值会混淆。
我的解决方案可能是手动修补此注册表项 - 但我想了解为什么regasm将“mscoree.dll”写入InprocServer32。
答案 0 :(得分:5)
解释很简单。当您在进程中使用本机(非托管)COM服务器时,它将被加载到使用者进程中,并且使用者进程直接调用其函数。
使用托管代码COM暴露的程序集,这无法轻松实现。在托管代码的情况下,需要执行托管/非托管交互的中间层。 mscoree.dll
充当此中间层。因此,当加载消费者调用CoCreateInstance()
mscoree.dll
时,通过加载暴露于COM的程序集托管代码并将所有调用转发给后者来模拟COM服务器。