2010-05-28 34 views
4

Quand j'enregistrer mon Assemblée .NET avec regasm.exe la clé de RegistreRegasm écrit mscoree.dll dans la clé du Registre InprocServer32

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

est défini sur "mscoree.dll".

Toutefois, j'essaie d'imiter un serveur COM existant qui a été écrit en C. Lors de l'enregistrement de cet ancien serveur COM, InprocServer32 est défini sur le chemin d'accès complet à ce composant.

Malheureusement le système existant (un hôte de plugin que je ne peux pas changer) lit et utilise cette valeur - un est confondu par la valeur "mscoree.dll".

Ma solution pourrait être de patcher cette entrée de registre manuellement - mais je voudrais comprendre pourquoi regasm écrit "mscoree.dll" dans InprocServer32.

Répondre

5

L'explication est assez facile. Lorsque vous utilisez un serveur COM natif (non géré) dans-proc, il est chargé dans le processus consommateur et le processus consommateur appelle directement ses fonctions.

Cela ne peut pas fonctionner aussi facilement avec un assembly géré par le code managé COM. Dans le cas d'un code géré, une couche intermédiaire est nécessaire pour effectuer l'interaction gérée/non gérée. mscoree.dll agit comme cette couche intermédiaire. Ainsi, lorsque le consommateur appelle CoCreateInstance()mscoree.dll est chargé et émule le serveur COM en chargeant le code géré assemblé COM-exposé et rediriger tous les appels à ce dernier.